2.3. Cây tứ phân điểm (Point Quadtrees)
2.3.3. Truy vấn khoảng trong cây tứ phân điểm
Các truy vấn khoảng trong cây tứ phân được thực hiện gần như cách thức thực hiện trong cây 2-d. Mỗi nút trong một cây tứ phân thể hiện một vùng và phương pháp tính tóan và truy vấn khoảng tránh việc tìm kiếm các cành bắt nguồn từ những nút mà các vùng liên quan đến chúng không giao với đường tròn định nghĩa bởi truy vấn khoảng. Đại thể như nếu chúng ta đang tìm kiếm cây tứ phân điểm bắt nguồn từ T với tất cả các điểm trong một đường tròn C, tâm (xc, yc) và có bán kính là r, giải thuật được nêu ra như sau:
Giải thuật 2.1
proc RangeQueryPointQuadtree(T: newptnodetype, C: circle) 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 (2k x 2k). Người
(LUAN.VAN.THAC.SI).Mot.so.van.de.ve.luu.tru.va.chi.muc.trong.co.so.du.lieu.khong.gian.Luan.van.ThS.Cong.nghe.thong.tin.60.48.05(LUAN.VAN.THAC.SI).Mot.so.van.de.ve.luu.tru.va.chi.muc.trong.co.so.du.lieu.khong.gian.Luan.van.ThS.Cong.nghe.thong.tin.60.48.05(LUAN.VAN.THAC.SI).Mot.so.van.de.ve.luu.tru.va.chi.muc.trong.co.so.du.lieu.khong.gian.Luan.van.ThS.Cong.nghe.thong.tin.60.48.05(LUAN.VAN.THAC.SI).Mot.so.van.de.ve.luu.tru.va.chi.muc.trong.co.so.du.lieu.khong.gian.Luan.van.ThS.Cong.nghe.thong.tin.60.48.05
NW SW NE SE
a) A
b)
A B
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 = 2k, YLB = 0, YUB = 2k. 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
Bảng 2.2. Mô tả bốn cành của nút N trong cây tứ phân MX 2.4.1. Chèn và tìm kiếm trong MX-Quadtree
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.8, hãy tiến hành các bước như dưới đây:
Hình 2.8. Trình tự chèn vào cây tứ phân MX
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.8a chỉ ra kết quả cây tứ phân MX sau khi chèn điểm A. Hình 2.9a 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.8b và 2.9b.
3. 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.8c và 2.9c chỉ ra kết quả.
4. Cuối cùng, hình 2.8d và 2.9d biểu diễn kết quả sau khi chèn D.
c)
A B C
d)
A B C D
a/ b/ c/ d/
Hình 2.9. Mô tả phép chèn điểm vào cây tứ phân MX 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.8d. 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.8d. 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á.