MultiBooks - Tổng hợp IT - PC part 11 pps

6 381 0
MultiBooks - Tổng hợp IT - PC part 11 pps

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

Thông tin tài liệu

1. If region(T) Ç C = Æ then Halt 2. else (a) If (T.XVAL, T.YVAL)Î C then print (T.XVAL, T.YVAL); (b) RangeQueryPointQuadtree(T.NW, C); (c) RangeQueryPointQuadtree(T.SW, C); (d) RangeQueryPointQuadtree(T.NE, C); (e) RangeQueryPointQuadtree(T.SE, C); End proc 2.4 Cây tứ phân matrix MX (MX-Quadtrees) Trong cả hai trường hợp cây 2-d và cây tứ phân điểm, hình thù của cây phụ thuộc vào thứ tự các đối tượng được chèn vào cây. Đặc biệt, thứ tự ảnh hưởng đến chiều cao của cây, do đó ảnh hưởng đến độ phức tạp của các thao tác tìm kiếm và chèn. Mỗi nút N của cây 2-d và cây tứ phân điểm biểu diễn vùng và phân chia vùng thành 2 (trường hợp cây 2-d) hoặc 4 (trường hợp cây tứ phân) vùng con. Việc phân chia có thể không đều vì nó phụ thuộc vào vị trí điểm (N.XVAL, N.YVAL) trong vùng biểu diễn bởi N. Ngược lại, mục tiêu của cây MX-quadtree là để đảm bảo hình dạng (và chiều cao) của cây độc lập với số lượng các nút của cây, cũng như thứ tự chèn các nút này. Thêm nữa, MX-quadtree tập trung vào việc đem lại các giải thuật xoá và tìm kiếm có hiệu quả. Một cách ngắn gọn, cây MX-quadtree làm việc như sau: Đầu tiên chúng ta giả định rằng bản đồ đang được phân thành một lưới kích thước (2 k x 2 k ). Người phát triển ứng dụng tự do lựa chọn k và một khi nó được chọn thì nó phải cố định. MX-quadtree có cấu trúc nút tương tự như cây tứ phân điểm, đó là chúng có kiểu newqtnodetype. Có một sự khác biệt là gốc của MX-quadtree miêu tả vùng xác định bởi XLB = 0, XUB = 2 k , YLB = 0, YUB = 2 k . Hơn nữa, khi một vùng được phân chia, nó được chia ở giữa. Do vậy, nếu N là một nút, khi đó các vùng thể hiện bởi bốn cành của N được mô tả theo bảng dưới đây. Trong bảng này, w ký hiệu chiều rộng của vùng được biểu diễn bởi N và được cho bởi w= N.XUB – N.XLB. Do tất cả các vùng được biểu diễn bởi các nút trong MX-quadtree là các vùng vuông, nên w = N.YUB – N.YLB. Con XLB XUB YLB YUB NW N.XLB N.XLB +w/2 N.YLB +w/2 N.YLB +w SW N.XLB N.XLB +w/2 N.YLB N.YLB +w/2 NE N.XLB +w/2 N.XLB +w N.YLB +w/2 N.YLB +w SE N.XLB +w/2 N.XLB +w N.YLB N.YLB +w/2 2.4.1 Chèn và tìm kiếm trong MX-Quadtree Error! Chúng ta hãy xem xét cách chèn điểm vào cây MX-Quadtree. Mỗi điểm (x, y) trong cây MX-Quadtree biểu diễn vùng 1x1 mà góc dưới bên trái là (x, y). Điểm chèn vào nút biểu diễn vùng 1x1 tương ứng với điểm này. Giả sử bây giờ chúng ta muốn chèn các điểm A, B, C và D như trên hình 2.12, hãy tiến hành các bước như dưới đây: 1. Việc chèn điểm A với toạ độ (1, 3) như sau: Là nút gốc biểu diễn toàn bộ vùng và A nằm trong NW. Do vậy, cành NW của gốc tương ứng vùng 2x2 mà góc dưới bên trái của nó là điểm (0, 2). Điểm A nằm trong góc NE của vùng này. Hình 2.12a chỉ ra kết quả cây tứ phân MX sau khi chèn điểm A. Hình 2.13a chỉ ra việc phân chia vùng. Chú ý rằng điểm A được chèn vào mức 2 của cây và mức này bằng giá trị k. Tổng quát là điểm luôn được chèn vào mức k trong cây tứ phân MX. 2. Việc chèn điểm B với toạ độ (3, 3) sẽ xác định được B thuộc nhánh NE của gốc. Do vậy cành NE của nút gốc tương ứng vùng 2x2 với góc dưới bên trái là (2, 2). Điểm B lại nằm trong góc NE của vùng này. Kết quả được thể hiện trên hình 2.12b và 2.13b. 3. Error! Error! Việc chèn điểm C với tọa độ (3, 1) được tiến hành như sau: C nằm trong góc SE của toàn vùng. Điều này đòi hỏi tạo nút mới là nút con SE của gốc. C nằm trong vùng con NE của nút này. Hình 2.12c và 2.13c chỉ ra kết quả. 4. Cuối cùng, hình 2.12d và 2.13d biểu diễn kết quả sau khi chèn D. 2.4.2 Thao tác xoá trong MX-Quadtrees Thao tác xoá trong một MX-Quadtrees là một thao tác tương đối đơn giản bởi vì toàn bộ các điểm đều nằm ở cấp cuối (đều là các nút lá). Lưu ý rằng nếu N là một nút không phải lá trong cây MX-Quadtrees với gốc là T thì khi đó vùng biểu diễn bởi nút N có ít nhất một điểm thuộc cây. Nếu chúng ta muốn xoá một điểm (x, y) từ cây T, việc đầu tiên là thiết lập liên kết tương ứng của cha nút N tới NIL. Nói cách khác nếu M là cha của N và M.DIR trỏ tới N thì thiết lập M.DIR=NIL và cho lại N để giải phóng vùng nhớ. Bây giờ tiến hành kiểm tra xem bốn trường liên kết của M đều là NIL? nếu đúng ta khảo sát cha của M (ta gọi nó là P). Vì M là con của P, ta tìm trường liên kết DIR1 sao cho P.DIR1=M. Sau đó thiết lập P.DIR1=NIL và tiếp tục kiểm tra xem toàn bộ các trường liên kết của P có là NIL? Nếu đúng, tiếp tục tiến trình. Toàn bộ tiến trình đòi hỏi phải duyệt qua cây một lần từ đỉnh xuống đáy (để tìm nút sẽ xóa) và một lần đi ngược cây. Như vậy toàn bộ tiến trình sẽ là O(k) lần. Hãy xem xét tiến trình làm việc ra sao với cây MX trên hình 2.12d. Giả sử ta muốn xoá D. Việc xóa nút D không khó khăn vì ta tìm ra nó và đặt NIL vào trường liên kết SE của cha nó (cái trỏ đến D). Để xác định xem cha của D có hỏng? ta kiểm tra xem bốn trường liên kết nó là NIL? Không đúng vậy vì C và D có cùng cha. Mặt khác, xem xét việc huỷ bỏ A từ cây tứ phân MX trong hình 2.12d. Khi đặt NIL vào trường NE của cha nút A, ta thấy rằng cha của A kết thúc bởi 4 trường rỗng. Như vậy cha của A bị hỏng. Khi điều đó xảy ra, ta khảo sát cha của cha A (là gốc) và đặt NIL vào liên kết NW của gốc. Khi kiểm tra xem gốc có toàn bộ bốn trường liên kết là NIL? Điều đó không xảy ra và không thể collapsing. Kết thúc. 2.4.3 Truy vấn khoảng trong MX-Quadtrees Các truy vấn khoảng trong MX-Quadtrees được thực hiện một cách hoàn toàn tương tự như cây tứ phân điểm. Chỉ có hai điểm khác biệt đó là : Nội dung của các trường XLB, XUB, YLB và YUB là khác nhau. Điểm khác biệt thứ hai là trong cây MX-Quadtrees tất cả các điểm nằm ở các nút lá, do vậy đường tròn định nghĩa bởi truy vấn khoảng cần được thực hiện chỉ ở cấp độ lá. 2.4.4 PR-Quadtrees PR-Quadtrees là một sự biến thể của MX-Quadtrees. Trong MX-Quadtrees tất cả các điểm được lưu tại các nút lá. Vì thế khi xem xét một MX-Quadtrees biểu diễn vùng 2 k x 2 k , việc tìm kiếm và chèn là quy trình O(k). Nhớ lại rằng mỗi nút N trong cây MX biểu diễn một vùng, Reg(N). Bằng cách mở rộng cấu trúc dữ liệu để bao gồm điểm trong nó, ta có thể điều chỉnh luật chia vùng cho cây tứ phân MX bằng cách đòi hỏi nút N bị chia nếu Reg(N) chứa hai hay nhiều điểm. Nếu N chứa 1 điểm thì nó được lưu trong nút N thay cho nút lá. Điều này tránh được việc mở rộng nút N và làm giảm thời gian chèn và tìm kiếm. 2.5 Cây R (R-Trees) Trong phần này chúng ta sẽ giới thiệu một kiểu cấu trúc dữ liệu mới gọi là R-Trees, cấu trúc này có thể được sử dụng để lưu trữ các vùng chữ nhật của một hình ảnh hay bản đồ. R-Trees đặc biệt hữu ích trong việc lưu trữ dữ liệu số lượng lớn trên đĩa. Do việc truy cập đĩa thường rất chậm, R-Trees cung cấp một cách thuận tiện trong việc cực tiểu hoá số lần truy cập đĩa. Mỗi R-Trees kết hợp với một thứ tự là một số nguyên K. Mỗi nút R-Trees không phải là lá bao gồm một tập từ K/2 đến K hình chữ nhật. Bằng trực quan thấy rằng mỗi nút không lá trong R-Trees trừ nút gốc ít nhất phải là một nửa. Đặc điểm này làm cho R-Trees thích hợp với việc truy vấn đĩa bởi vì mỗi truy cập đĩa mang lại một trang chứa đựng một vài hình chữ nhật (ít nhất K/2). Hơn nữa, do việc lưu trữ một số hình chữ nhật trong một trang, chiều cao của R-Trees sử dụng để lưu trữ tập hợp các hình chữ nhật, thường rất nhỏ. Do vậy số lần truy cập đĩa giảm bớt so với các cây mô tả trên. Một hình chữ nhật hoặc là “thực” hoặc là một hình bao hàm một nhóm hình chữ nhật. Các nút lá bao gồm một hình chữ nhật “thực” trong khi các nút không lá bao gồm các hình chữ nhật nhóm từ một tập các hình chữ nhật. Hình 2.14 chỉ ra cách nhóm các hình chữ nhật như sau. Nhóm Các chữ nhật G1 R1, R2, R3 G2 R4, R5, R6, R7 G3 R8, R9 Error! Hình 2.14 chỉ ra cây R bậc 4 liên kết với các chữ nhật trên hình 2.14. Cấu trúc của một R-Trees được định nghĩa như sau: rtnodetype = record Rect 1 , , Rect k : Rectangle; P 1 , , P k : rtnodetype; end Ta không đi chi tiết kiểu dữ liệu Rectangle trên đây. Có nhiều cách biểu diễn chữ nhật. 2.5.1 Chèn và tìm kiếm trong R-Trees Khi chèn một hình chữ nhật mới vào một R-Trees ta làm theo những bước dưới đây: 1. Chúng ta xem xét trong số các hình chữ nhật liên quan với nút gốc hình nào cần được mở rộng ít nhất (về mặt diện tích) để chứa hình chữ nhật được chèn. Ví dụ nếu chúng ta chèn hình chữ nhật R 10 (hình 2.16) vào cây R trên hình 2.15 thì cách dễ nhất là mở rộng nhóm G1 bởi vì việc mở rộng các nhóm khác thì diện tích bị bao phủ bởi nhóm này sẽ tăng đáng kể. 2. Do đó từ những liên kết của G1 (từ gốc, hình 2.15) chúng ta sẽ chèn R10 vào khe có sẵn. 3. Bây giờ chúng ta xem xét việc chèn R11. Nhóm mà diện tích của nó phải được mở rộng tối thiểu trong trường hợp này là G2. Tuy nhiên, con G2 của gốc đã đầy. Do vậy có một vài lựa chọn khác như trên hình 2.17. 4. Từ 2 lựa chọn trên hình 2.17, ta muốn có giải pháp trong hình 2.17b vì diện tích tổng thể của các chữ nhật nhóm là nhỏ nhất. . thao tác tìm kiếm và chèn. Mỗi nút N của cây 2-d và cây tứ phân điểm biểu diễn vùng và phân chia vùng thành 2 (trường hợp cây 2-d) hoặc 4 (trường hợp cây tứ phân) vùng con. Việc phân chia có. MX-Quadtrees tất cả các điểm nằm ở các nút lá, do vậy đường tròn định nghĩa bởi truy vấn khoảng cần được thực hiện chỉ ở cấp độ lá. 2.4.4 PR-Quadtrees PR-Quadtrees là một sự biến thể của MX-Quadtrees đĩa thường rất chậm, R-Trees cung cấp một cách thuận tiện trong việc cực tiểu hoá số lần truy cập đĩa. Mỗi R-Trees kết hợp với một thứ tự là một số nguyên K. Mỗi nút R-Trees không phải là

Ngày đăng: 08/07/2014, 09:20

Từ khóa liên quan

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

  • Đang cập nhật ...

Tài liệu liên quan