Một Số Cấu Trúc Dữ Liệu Đặc Biệt

89 1.1K 2
Một Số Cấu Trúc Dữ Liệu Đặc Biệt

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

các thuật toán cấu trúc dữ liệu đặc biệt , giúp ích cho các kì thi lập trình.Sách được viết bời thầy Lê Minh Hoàng và một số thầy khác .Sách được phổ biến trong cuộc tập huấn Giáo Viên , Sách không những có lí thuyết đầy đủ dễ hiểu mà còn giải một lớp bài giúp người đọc hiểu thêm về cấu trúc đặc biệt rõ hơn

Cây quản lý phạm vi   này gii thiu cây qun lý phm vi (range trees). t cu trúc d liu quan trng, có nhiu ng dng trong các thut toán hình hc, truy v d liu và x lý tín hiu. Cây qun lý ph    cp nhiu trong các k thi olympic tin hc trong kho l 1. Giới thiệu Gi s ta có m d liu cha h a các nhân viên trong mt công ty, thông tin v mi nhân viên là mt bn ghi gm nhia chp b  d liu này luôn bing bi các lnh thêm/bt/cp nht b    i truy vn d  m s i    tui t 40 ti 50 và có m tháng t 3 triu ti 5 triu  Tính ta nhi có thâm niên công tác t 10  lên và có t 2 ti 4 con Dng bài toán qung và tr li các dng truy vn k trên có th mô i dng hình hc: Chng hn ta có th biu din mi nhân viên bi mm trên mt phng t  vi trc t  là tui và trc t  là mm s  tui t 40 ti 50 và có m 3 ti 5 tri din gii thành: m s m có t            (Xem Hình 1) Hình 1 Bài toán truy vn phm vi có th phát biu hình thn qun lý mt tp  các ng biu din bi các m trong không gian  chiu, mi m ngoài t ca nó còn có th cha thêm mt s thông tin khác * . Tp  liên tc bing bi phép thêm/bi các truy vn. Mi truy vn, cho bi phm vi là mt siêu hp                        , yêu cu tr li v thông tin tng hp t tt c m nm trong siêu hp .  này, ta quan tâm ti các dng thông tin tng hp có tính cht  trc là nu  và  là hai tm ri nhau thì thông tin tng hp t m    có th d c t thông tin tng hp trên  và thông tin tng hp trên  v  d liu nhân s, ta có th d c:  S i trong tp    bng cách ly s i trong  cng s i trong .  a nt trong tp   ,        có th nh bng công thc            S u tp  ch g lc tt c nhm nm trong phm vi truy vn và tng hp thông tin t nhm  m ln, mc dù phép thêm bm có th thc hin * Trong CSDL quan h, mt s ct s nh làm t và nhng ct còn li s c coi là thông tin cn truy vn tùy theo tng ng dng c th. Ο   40 50 3.000.000 5.000.000 nhanh (thi gian     nu s dng cu trúc d ling), thi gian truy vn tr nên rt chm (mt     thi gian  tr li mi truy vn vi  là s m trong  và  là s chiu ca không gian). Cây qun lý phm vi là mt cu trúc d liu hiu qu  gii quyt bài toán trên, nó cho phép thc hin mi phép thêm, bt, cp nht, truy vn trong thi gian       , thích hp vi x lý d liu lng   t chm so vi ng     khi  Trong các phn tip theo, phn 2 kho sát mt s cu trúc d liu và thut toán gii quyt bài toán truy vn phm vi 1 chiu. Phn 3 m rng các cu trúc d liu cho truy vn phm vi nhiu chiu. Phn 4 là mt s bài toán ng dng, m rng ca cây qun lý phm vi, cui cùng là kt lun và danh mc tài liu tham kho. 2. Truy vấn phạm vi một chiều 2.1. Cây nhị phân tìm kiếm t nh biu din danh sách là s dng mng hoc danh sách móc ni. S dng mng có t tt vi phép truy cp ngu nhiên   b chm nu danh sách luôn b bi ng bi các phép  dng danh sách móc ni có th thun ti trong các phép chèn/xóa thì li g  m trong phép truy cp ngu nhiên. Trong mc này chúng ta s trình bày mu din danh sách bng cây nh p ngu nhiên, chèn, xóa và truy vn c thc hin trong thi gian     . N c trình bày qua mt bài toán c th: Bài toán (Range Query): Cho mt danh sách   cha các s nguyên. Ký hiu     là s phn t trong danh sách. Các phn t  liên tip bu t 1. Bu vi mt danh sách rng, xét các phép bii danh sách   Phép chèn     : Chèn mt s  vào v trí  ca danh sách. ng hp     thì  s c thêm vào cui danh sách.  Phép xóa     : Xóa phn t th  trong danh sách.  Phép cp nht     : t phn t th  bng .  Phép truy vn     : Tr v tng các phn t nm trong phm vi t  ti  Yêu cu: Cho dãy  phép bic thc hin tun t, hãy tr li tt c các truy vn  Input  Dòng 1 cha s     dòng tip, mi dòng cho thông tin v mt phép bii. Mi dòng bt u bi mt ký t      Nu ký t u dòng là thì tip theo là hai s nguyên  ng vi phép chèn     (  )  Nu ký t u dòng là thì tip theo là s nguyên  ng vi phép xóa     .  Nu ký t p theo là hai s nguyên  ng vi phép cp nht     (  )  Nu ký t p theo là hai s nguyên  ng vi phép truy vn     () Output Tr li tt c các truy vn , vi mi truy vn in ra câu tr li trên 1 dòng Sample Input Sample Output 11 I 1 8 {8} I 1 3 {3 8} I 3 6 {3 8 6} I 3 2 {3 8 2 6} Q 1 3 U 3 4 {3 8 4 6} I 2 5 {3 5 8 4 6} D 1 {5 8 4 6} Q 2 4 U 1 7 {7 8 4 6} Q 1 4 13 18 25 2.1.1. Biểu diễn danh sách Chúng ta s  các phn t ca danh sách  trong mt cu trúc cây nh phân sao cho nu duyt cây theo thứ tự giữa thì các phn t ca  s c lit  t trong danh sách. Cây nh t bi mt cu trúc liên kng và con trng chính ca cách tip cn này là đồng bộ thứ tự của danh sách trừu tượng  với thứ tự giữa của cây, quy việc chèn xóa trên  về việc chèn xóa trên cây nhị phân. Có mt s  ng gia cu trúc d liu này và cây nh phân tìm kim (binary search trees – BST):  Nu danh sách trng  gm các phn t p xn thì t nhiên cây biu din danh sách tr thành cây nh phân tìm kim.  Nu duyt cây nh phân tìm kim theo th t gin các khóa tìm kim, còn nu duyt cây biu din danh sách theo th t gia ta s c danh sách .  Có th có nhiu cu trúc cây nh phân tìm kim ng vi mt tp khóa tìm ki y có nhiu cu trúc cây biu din danh sách ng vi danh sách .  ng cây biu din danh sách có th k tha t cây nh phân tìm kim bi các k thut cân bng cây nh phân tìm kim luôn bo tn th t gia cng vi th t n ca các khóa tìm king b th t danh sách vi th t gia ca các nút trên cây ch không phi là th t c hay th t sau. Chính vì có nhing gia cu trúc cây biu din danh sách và cây nh phân tìm kim, tcây nh phân tìm kim  binary search trees (BST) cho cu trúc d liu này. 2.1.2. Cấu trúc nút Có th thy rng khi duyt cây theo th t gia thì các nút mt nhánh cây s c lit kê trong mn liên tip, không có nút  nhánh khác xen vào. Nói cách khác, bn cht mi nhánh cây là mn các phn t liên tip trong danh sách trng . i ý cho vi thêm nhng thông tin tng hp v n liên tip này ti nhng mng hp c th này, mi nút  s cha thêm 2 thông tin: S nút trong nhánh gc    thc hin phép truy cp ngu nhiên) và tng các phn t trong nhánh gc   tr li truy vn tng). Tóm li, mi nút trên cây là mt bn ghi gng:  ng : Cha phn t   ng  Cha liên kt (con tr) ti nút cha, nu là nút gc (không có nút ng  t bng mt con tr c bit, ký hiu .  ng : Cha liên kt (con tr) ti nút con trái, nu nút không có nhánh con trái thì tng  t bng .  ng : Cha liên kt (con tr) ti nút con phi, nu nút không có nhánh con phng  t bng .  Trng  cha s nút trong nhánh gc   ng  cha tng phn t cha trong nhánh gc  Hình 2. Cây biu din danh sách gm 7 phn t (1, 7, 3, 6, 5, 4, 2)     1     7    3     6     5   4    2 type PNode = ^TNode; //Kiểu con trỏ tới một nút TNode = record key: TKey; P, L, R: PNode; len: Integer; sum: Int64; end; var sentinel: TNode; nilT: PNode; //Con trỏ tới nút đặt biệt root: PNode; //Con trỏ tới nút gốc begin nilT := @sentinel; nilT^.size := 0; nilT^.sum := 0; end. Các ngôn ng lp trình bng cung cp hng con tr  (hay  gán cho các liên kt không tn ti trong cu trúc d liu. Hng con tr  ch c s dng  so sánh vi các con tr c phép truy cp bin ng . t cây nh phân, chúng ta s dng con tr  gán cho nhng liên kt không có thc (công d  ). Ch có khác là con tr  tr ti mt bin  có thực m   ng ca  là vô nghĩa. Chúng ta hy sinh mt ô nh cho bin   n hóa các thao tác trên cây * . Th tc     ng hp các thông tin trong  t nhng thông tin ph tr trong hai nút con: procedure Update(x: PNode); begin x^.len := x^.L^.len + x^.R^.len + 1; //Tính số nút trong nhánh x x^.sum := x^.L^.sum + x^.R^.sum + x^.value; //Tính tổng các phần tử trong nhánh x end;  c  và .  d trình bày các thao tác, ta vit sn các th tc móc ni các nút: Th tc     cho  làm con trái , th tc     cho  làm con phi  * Ma bi bm tra con tr  c khi truy cp nút . procedure SetL(x, y: PNode); begin y^.P := x; x^.L := y; end; procedure SetR(x, y: PNode); begin y^.P := x; x^.R := y; end; 2.1.3. Truy cập ngẫu nhiên C các phép biu có mt tham s v trí, vy viu tiên là phng vi v trí  trong danh sách trng là nút nào trong cây. Theo nguyên lý ca phép duyt cây theo th t gia (duyt nhánh t nhánh phi), thu ng vi v trí  có th din t   tìm nút th  trong nhánh cây gc c hnh  là s th t ca nút gc  (theo th t gia):    Nu  thì nút cn tìm chính là nút .  Nu  thì quy v tìm nút th  trong nhánh con trái ca .  Nu  thì quy v tìm nút th  trong nhánh con phi ca . S c l ng vi v trí  có th tính b sâu ca nút kt qu cng thêm 1. Phép truy cp ng    t bng hàm     : Nhn vào nút  và mt s nguyên , tr v ng vi v c . function NodeAt(x: PNode; i: Integer): PNode; var ord: Integer; begin repeat ord := x^.L^.len + 1; //Xác định số thứ tự nút x if ord = i then Break; //Nút cần tìm chính là x if i < ord then //Quy về tìm nút thứ i trong nhánh con trái x := x^.L else //Quy về tìm nút thứ i – ord trong nhánh con phải begin i := i - ord; x := x^.R; end; until False; Result := x; end; 2.1.4. Vấn đề cân bằng cây Thao tác truy cp ngu nhiên thc hin mt phép di chuyn t gc xung mt nút mang s th t nh, nu cây nh phân suy bin, phép truy cp ngu nhiên không khác gì phép truy cp tun t trên danh sách móc ni  và tr nên kém hiu qu. Rt may mn là ta có nhbng cây. Nhc gi cho chiu cao cây là mng     vi  là s nút trên cây, hom bo cho dãy  thao tác truy cp ngu nhiên c thc hin trong thi gian     . Nh    bc k tha t các cu trúc d liu cây nh phân tìm kim t cân bng (self-balancing binary search trees  Treaps, cây nh phân tìm kim ng Hu ht các k thut cân bc thc hin bi phép quay cây, có hai loi: quay phi (right rotation) và quay trái (left rotation).  Nu  là con trái ca , phép quay phi theo liên kt  ct nhánh con phi ca  làm con trái ca   làm con phi ca . Nút  c y lên làm gc nhánh thay cho nút     Hình 3, có th thy rng phép quay phi bo tn th t gia .  c li, nu  là con phi ca , phép quay trái theo liên kt  vi  ct nhánh con trái ca  làm con phi ca   làm con trái ca  y  lên làm nút nhánh thay cho nút   Hình 3 thy rng phép quay trái bo tn th t gia      . Hình 3. Phép quay cây Ta vit mt thao tác     t   i , và , phép     s quay theo liên kt   y nút  lên phía gc cây  sâu ca  gim 1) và kéo nút  xut mc làm con nút . Chú ý là sau phép     , ta ch cn cp nht thông tin ph tr ca nút  và   p nht thông tin ph tr ca nút  ng   ng ), thông tin ph tr trong các núi.      Quay phi                    Quay trái [...]... thông qua các đoạn sơ cấp, ngoài ra việc cài đặt dễ dàng cũng là một ưu điểm của cấu trúc dữ liệu này Ta giới hạn lại bài toán Range Query trong trường hợp đặc biệt: không có phép chèn và xóa phần tử để khảo sát cấu trúc dữ liệu cây quản lý đoạn Bài toán: (Range Query 2) Cho một dãy gồm (  Phép cập nhật  Phép truy vấn Yêu cầu: Cho dãy ( số nguyên ( ) Xét hai phép biến đổi: ): Đặt ): Trả về tổng các... một dạng cấu trúc dữ liệu khác cũng cung cấp các chức năng tương đương Trong mục này, ta đơn giản hóa cấu trúc segment trees để giải quyết bài toán truy vấn phạm vi Điều này làm cho cây quản lý đoạn chỉ giống với segment trees ở hình ảnh biểu diễn còn các thuộc tính và phương thức trở nên đơn giản và “yếu” hơn nhiều so với cấu trúc nguyên thủy, theo nghĩa không trả lời được những truy vấn khó như cấu. .. minh được rằng cây Splay có thời gian thực hiện giải thuật trên một dãy thao tác chèn/xóa/tìm kiếm tương đương với cây nhị phân tìm kiếm tối ưu khi đánh giá bằng ký pháp O lớn (dĩ nhiên là sai khác một hằng số ẩn trong ký pháp O) 2.2 Cây quản lý đoạn Segment trees [2] là một cấu trúc dữ liệu ban đầu được thiết kế cho các ứng dụng hình học Cấu trúc này khá phức tạp và được sử dụng để trả lời nhiều loại... biểu diễn số nguyên có dấu Khi biểu diễn một số nguyên bằng dãy đánh số từ 0 tới bit: thì các bit được theo thứ tự từ phải qua trái, gọi là thứ tự từ bit thấp nhất ( ) tới bit cao nhất ( ) Mỗi giá trị thuộc một kiểu số nguyên được biểu diễn trong máy tính bằng một dãy bit chiều dài cố định, nhưng tùy theo kiểu số nguyên, việc giải mã dãy bit ra giá trị số có sự khác nhau Cơ chế biểu diễn số nguyên... Hình 10 Một số ví dụ về cây nhị thức Cây nhị thức thường được sử dụng để cài đặt binomial heaps [9] và fibonacci heaps [6] Dưới đây ta sẽ trình bày một phương pháp đánh số các nút trên cây nhị thức để giải quyết bài toán truy vấn phạm vi [5] Do phương pháp này sử dụng biểu diễn nhị phân để quản lý chỉ số, tác giả đã đặt tên cho nó là cây chỉ số nhị phân (binary indexed trees - BIT) một số tài liệu còn... -26 tùy theo kiểu số nguyên trên từng toán hạng Byte (không dấu) hay ShortInt (có dấu)* Một số công thức biến đổi bit:  Phép cộng 1 Để tăng một số nguyên lên 1, máy sẽ xét dãy bit biểu diễn số nguyên đó, tìm bit 0 thấp nhất thay bởi bit 1 và đặt tất cả các bit đứng sau thành 0 Ví dụ khi cộng 1 vào số , máy xác định bit 0 cuối cùng (bit số 2) thay bởi 1 và đặt các bit đứng sau (bit số 0, 1) thành 0,... là nút có số nút con (bậc) lớn nhất Nếu ta ta đánh số các nút con của nút gốc theo thứ tự từ trái qua phải bởi các số nguyên , 2,…,0 thì nút con thứ là gốc của một cây nhị thức Định lý 3 có thể dễ dàng chứng minh bằng quy nạp Tên gọi cây nhị thức xuất phát từ tính chất thứ ba ( ) là hệ số nhị thức (số tổ hợp chập phần tử) của tập gồm Cây nhị thức là một cây có tính thứ tự (các nút con của một nút được... dữ liệu trong hình học tính toán Cấu trúc mà mục này nói đến, tôi tạm gọi là cây quản lý đoạn, chỉ là một hạn chế của interval trees hay segment trees trong trường hợp cụ thể Mọi bài toán giải quyết được bằng cây quản lý đoạn đều có thể giải được bằng cấu trúc dữ liệu đã trình bày ở mục 2.1, tuy nhiên điều ngược lại không đúng Mặc dù vậy, cây quản lý đoạn cung cấp một cách quản lý mới thông qua các... qua số lần thực hiện thao tác và số lời gọi hàm Nhận xét rằng mỗi khi phép truy cập phần tử đi từ gốc xuống một nút thì ngay sau đó là một lệnh chuyển nút đó lên gốc Chính vì vậy thời gian thực hiện giải thuật có thể đánh giá qua dãy các thao tác , số thao tác cần thực hiện là một đại lượng ( ) Các nghiên cứu lý thuyết đã chỉ ra rằng một phép thực hiện riêng rẽ có thể mất thời gian ( ) với là số nút... của nó quản lý các ⌊( ) 2⌋  Nếu một nút chỉ quản lý một đối tượng thì nó sẽ là nút lá và không có nút con Trong một số trường hợp cần tăng tốc thuật toán, mỗi đối tượng sẽ [ ] trỏ tới nút lá quản lý trực tiếp đối tượng được gắn với một con trỏ Để thuận tiện cho trình bày, với mỗi nút ta lưu thêm hai chỉ số biết quản lý các phần tử từ trong mảng từ chỉ số tới chỉ số và cho Hình 6 là ví dụ về cây

Ngày đăng: 07/10/2014, 23:31

Từ khóa liên quan

Mục lục

  • Cây quản lý phạm vi

  • 1. Giới thiệu

  • 2. Truy vấn phạm vi một chiều

    • 2.1. Cây nhị phân tìm kiếm

      • 2.1.1. Biểu diễn danh sách

      • 2.1.2. Cấu trúc nút

      • 2.1.3. Truy cập ngẫu nhiên

      • 2.1.4. Vấn đề cân bằng cây

      • 2.1.5. Cây Splay

        •  Thao tác Splay

        •  Tách

        •  Ghép

        •  Chèn, xóa, cập nhật và truy vấn

        • 2.1.6. Cài đặt

        • 2.2. Cây quản lý đoạn

          • 2.2.1. Cấu trúc

          • 2.2.2. Biểu diễn

          • 2.2.3. Cập nhật

          • 2.2.4. Truy vấn

          • 2.2.5. Cài đặt

          • 2.3. Cây chỉ số nhị phân

            • 2.3.1. Cơ chế biểu diễn số nguyên có dấu

              •  Phép cộng 1

              •  Phép lấy số đối

              • 2.3.2. Đánh số các nút

                •  Tính số nút trong một nhánh

                •  Xác định nút cha của một nút

Tài liệu cùng người dùng

Tài liệu liên quan