Cây k-d đƣợc sử dụng để lƣu trữ dữ liệu điểm k-chiều nhƣ chỉ ra trên hình 2.1. Không sử dụng nó để lƣu trữ dữ liệu vùng. Nhƣ vậy, cây 2-d (khi k=2) lƣu trữ dữ liệu điểm 2-chiều, cây 3-d lƣu trữ dữ liệu điểm 3-chiều... Thí dụ này đề cập đến dữ liệu điểm 2-d, sau đó khái quát lên dữ liệu điểm 3-d.
Cấu trúc nút
Trong cây 2-d, mỗi nút có cấu trúc bản ghi nhất định với kiểu nhƣ sau:
INFO XVAL YVAL
LLINK RLINK
- Trƣờng INFO có thể có kiểu bất kỳ do ngƣời sử dụng định nghĩa và phụ thuộc vào ứng dụng cụ thể. Thí dụ, nó có thể là trƣờng xâu ký tự mô tả địa danh, hay nó có thể là bản ghi bao gồm các trƣờng name:string và population:integer...
- Trƣờng XVAL, YVAL biểu thị tọa độ điểm kết hợp với nút. - Các trƣờng LLINK và RLINK trỏ đến hai cành.
Giả sử T trỏ đến gốc của cây 2-d. Nếu N là nút trong cây, thì mức của N đƣợc xác định qui nạp nhƣ sau:
Cây 2-d là cây nhị phân bất kỳ nếu thoả mãn điều kiện sau:
- Nếu N là nút trong cây và level(N) là chẵn thì mỗi nút M trong cành rẽ nhánh từ N.LLINK có tính chất M.XVAL < N.XVAL, mỗi nút P trong cành rẽ nhánh từ N.RLINK có tính chất P.XVAL N.XVAL.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
- Nếu N là nút trong cây và level(N) là lẻ thì mỗi nút M trong cành rẽ nhánh từ N.LLINK có tính chất M.YVAL < N.YVAL, mỗi nút P trong cành rẽ nhánh từ N.RLINK có tính chất P.YVAL N.YVAL
Chèn và tìm kiếm trong cây 2-d
Việc chèn nút N vào cây do T trỏ tới được phát biểu phi hình thức như sau:
Kiểm tra xem N và T có thống nhất các trƣờng XVAL và YVAL hay không. Nếu thống nhất thì chỉ việc viết đè nút T và kết thúc. Nếu không hãy rẽ trái nếu N.XVAL<T.XVAL hoặc rẽ phải trong trƣờng hợp ngƣợc lại. Giả sử P là nút con ta đang khảo sát. Nếu N và P thống nhất các trƣờng XVAL và YVAL thì chỉ cần viết đè P và kết thúc, nếu không thì rẽ trái khi N.YVAL<P.YVAL hoặc rẽ phải trong trƣờng hợp ngƣợc lại. Lặp thủ tục này, hãy rẽ nhánh theo XVAL khi ta đang ở mức chẵn trong cây, và theo YVAL khi ta đang ở mức lẻ.
Hình 2.1: Lưới bản đồ với kích thước 8 x 8
Thí dụ trên hình 2.1 là lƣới bản đồ. Gốc (0, 0) ở góc dƣới trái của lƣới. Mỗi tế bào có kích thƣớc 8, do vậy kích thƣớc bản đồ là 8 x 8. Giả sử ta phải xây dựng cây 2-d, trƣờng INFO chỉ chứa tên địa điểm.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Danh sách các địa điểm nhƣ sau đây:
Thành phố (XVAL, YVAL) HDong HCa (19, 45) NgThuat NgSieu (40, 50) HNgang HBuom (38, 38) DDTu HBuom (54, 40) HManh HBong (4,4)
Khởi động cây là rỗng. Hình 2.2 là trình tự chèn vào cây. Các cây này đƣợc xây dựng nhƣ sau:
Hình 2.2: Trình tự chèn vào cây 2-d
Khi chèn HDongHCa vào cây có một nút với INFO= HDongHCa, XVAL=19, YVAL=45. Nút này biểu diễn toàn bộ vùng bản đồ. Tổng quát, mỗi nút N biểu diễn vùng Reg(N). Các trƣờng XVAL và YVAL của nút N xác định điểm trong Reg(N). Điểm (N.XVAL, N.YVAL) chia Reg(N) thành 2 phần bằng cách vẽ đƣờng thẳng đứng qua điểm trong vùng (nếu nút ở mức chẵn) hay vẽ đƣờng nằm ngang qua điểm trong vùng (nếu nút ở mức lẻ).
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Khi chèn NThuatNSieu, phải so sánh các trƣờng XVAL của nó với trƣờng này của HDongHCa. Chúng ta rẽ phải vì tọa độ x (40) của NThuatNSieu lớn hơn của HDongHCa (19). Kết quả trên hình 2.2b. HDongHCa chia đôi vùng bằng đƣờng thẳng đứng - mọi điểm nằm bên phải có tọa độ x lớn hơn hay bằng 19, bên trái có tọa độ nhỏ hơn 19. NThuatNSieu biểu diễn vùng bên phải của đƣờng thẳng đứng a của hình 2.2.
Khi chèn HNgangHBuom, trƣớc hết ta so sánh trƣờng XVAL của HNgangHBuom và HDongHCa. Trƣờng này của HNgangHBuom là 38, của HDongHCa là 19, vậy ta phải rẽ phải. Sau đó so sánh trƣờng YVAL của HNgangHBuom với YVAL của NThuatNSieu.YVAL của HNgangHBuom là 38, của NThuatNSieu là 50, do vậy phải rẽ trái. NThuatNsieu chia đôi vùng bằng đƣờng nằm ngang b của hình 2.2.Vùng phía trên đƣờng thẳng có tọa độ x lớn hơn hay bằng 19, tọa độ y lớn hơn hay bằng 50. Vùng phía dƣới đƣờng thẳng có toạ độ x nhỏ hơn 19 và tọa độ y nhỏ hơn 50.
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Khi chèn DDTuHBuom, trƣớc hết phải so sánh XVAL của DDTuHBuom và HDongHCa. Giá trị XVAL của DDTuHBuom là 54, còn của HDongHCa là 19, vậy phải rẽ phải. Sau đó so sánh YVAL của DDTuHBuom (40) và NThuatNSieu (50), vậy phải rẽ trái. Tiếp tục so sánh XVAL của DDTuHBuom (54) và HNgangHBuom (38), vậy phải rẽ phải.
Cuối cùng, khi chèn thành phố HManhHBong, ta phải so sánh XVAL của HManhHBong và HDongHCa. Ta rẽ trái vì tọa độ x của HManhHBong nhỏ hơn của HDongHCa. Kết quả đƣợc mô tả trên hình 2.2d và 2.2e.
Trong trƣờng hợp tồi nhất thì độ cao của cây 2-d với k nút là (k-1), việc tìm kiếm nút cho trƣớc sẽ mất O(k) lần.
Huỷ bỏ trong cây 2-d
Công việc phức tạp nhất với cây 2-d là huỷ bỏ điểm khỏi cây. Giả sử T là cây 2 chiều, điểm sẽ huỷ bỏ có tọa độ (x, y). Bƣớc thứ nhất của việc huỷ bỏ là tìm ra nút N trong T sao cho N.XVAL=x và N.YVAL=y. Nếu N là nút lá thì huỷ N là dễ dàng, chỉ việc đặt NIL cho LLINK, RLINK trong nút cha N, giải phóng vùng nhớ N. Nếu N là nút trong cây thì tình hình phức tạp hơn. Trong trƣờng hợp này, cây con có gốc tại N.LLINK (đặt tên là Tl) hay tại N.RLINK (đặt tên là Tr) là không rỗng. Cái ta muốn bây giờ là tìm nút R từ Tl hay Tr có thể thay thế nút N và có thể lần lƣợt đƣợc huỷ bỏ khỏi cây con. Nhƣ vậy các bƣớc của thuật toán huỷ bỏ nút N bên trong cây sẽ là:
Bước 1: Tìm nút ứng viên thay thế R trong Ti với i{l, r}.
Bước 2: Thay thế mọi trƣờng không có liên kết của N bởi các trƣờng của R.
Bước 3: Huỷ bỏ đệ qui R khỏi Ti.
Đệ qui trên đây có điểm dừng vì Ti với i{l, r} có độ cao nhỏ hơn cây T.
Bƣớc phức tạp nhất trong thuật toán trên là tìm ra nút ứng viên thay thế. Nút R muốn thay thế phải có quan hệ không gian với mọi nút P trong Tl và Tr sao cho N dẫn tới P. Có nghĩa rằng, nếu P ở phía tây nam N thì P phải ở tây nam R, nếu P ở
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
tây bắc N thì P phải ở tây bắc R, ... Nhƣ vậy, nút mong muốn thay thế R phải thoả các tính chất sau:
Mọi nút M trong Tl thoả M.XVAL<R.XVAL nếu level(N) là chẵn và M.YVAL<R.YVAL nếu level(N) là lẻ.
Mọi nút M trong Tr thoả M.XVALR.XVAL nếu level(N) là chẵn và M.YVALR.YVAL nếu level(N) là lẻ.
Nếu Tr không rỗng và level(N) là chẵn, thì bất kỳ nút nào trong Tr mà có trƣờng XVAL nhỏ nhất thì là nút ứng viên thay thế. Thí dụ, trong hình 2.2e, nếu ta lấy N là nút chứa HDongHCa, thì nút ứng viên thay thế từ cây con bên phải là nút liên kết với HNgangHBuom vì nó có tọa độ x nhỏ nhất trong các nút của cây con phía phảiHDongHCa.
Mặt khác, nếu Tr không rỗng và level(N) là lẻ thì bất kỳ nút nào trong Tr mà có trƣờng YVAL nhỏ nhất thì là nút ứng viên thay thế.
Tổng quát thì việc tìm kiếm nút thay thế từ cây con bên trái chỉ có thể thắng lợi dƣới một số điều kiện nhất định. Nếu level(N) là chẵn thì nút thay thế phù hợp trong Tl là nút bất kỳ nếu thoả mãn trƣờng XVAL của nó có giá trị lớn nhất. Tƣơng tự nếu level(N) là lẻ thì ta có thể sử dụng nút bất kỳ trong Tl mà có trƣờng YVAL lớn nhất để làm nút thay thế.
Vấn đề xảy ra là có thể có nhiều nút trong Tl cùng có XVAL (hay YVAL) lớn nhất, trong trƣờng hợp này điều kiện thứ hai trong định nghĩa cây 2-d có thể bị vi phạm bởi bƣớc 3 vừa mô tả trên. Tổng quát thì, nếu N là nút trong và ta muốn huỷ bỏ N khỏi T thì tìm thay thế từ cây con phải vì việc tìm ứng viên thay thế trong cây trái là không thể.
Cái gì xảy ra nếu N có cây phải rỗng (N.RLINK=NIL)? Trong trƣờng hợp này ta có thể chọn nút thay thế R từ Tl có giá trị x nhỏ nhất trong Tl (nếu level(N) là chẵn) hay có giá trị y nhỏ nhất trong Tl (nếu level(N) là lẻ). Sau đó ta sửa đổi bƣớc 2 trong thuật toán trên đây nhƣ sau:
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Bước 2 (sửa đổi): Thay thế toàn bộ các trƣờng không có liên kết của nút N bằng nút R. Đặt N.RLINK=N.LLINK và N.LLINK=NIL.
Truy vấn khoảng trong cây 2-d
Truy vấn khoảng trên cây 2-d có tên T là truy vấn theo chỉ định điểm (xc, yc) và khoảng r. Kết quả cho lại là tập điểm (x, y) trong cây T sao cho (x, y) nằm trong khoảng r của (xc, yc). Nói cách khác khoảng truy vấn xác định vòng tròn bán kính r có tâm (xc, yc) và tìm mọi điểm trong cây 2-d nằm trong vòng tròn.
Khi xử lý truy vấn khoảng, ta nhớ lại rằng mỗi nút N trong cây 2-d biểu diễn vùng RN, nếu vòng tròn và vùng RN không giao nhau thì không tìm thấy điểm nào trong cây con có gốc là nút N. Hãy quan sát các vùng trong hình 2.2d.
Nút có nhãn HDongHCa biểu diễn vùng chứa các điểm (x, y) của các số thực.
Nút có nhãn NThuatNSieu biểu diễn vùng chứa mọi điểm (x, y) với x19; nó có thể đƣợc thu nhận bởi biểu thức {(x, y) | x19}.
Nút có nhãn HNgangHBuom biểu diễn vùng chứa mọi điểm (x, y) với x19 và y<50; nó có thể đƣợc thu nhận bởi biểu thức {(x, y) | x19&y<50}.
Nút có nhãn DDTuHBuom biểu diễn vùng chứa mọi điểm (x, y) với x38 và y<50; nó có thể đƣợc thu nhận bởi biểu thức {(x, y) | x38&y<50}.
Cuối cùng, nút nhãn HManhHBong biểu diễn vùng chứa mọi điểm (x, y) với x<19. Tổng quát thì mỗi nút N có nhiều nhất 4 ràng buộc kết hợp biểu diễn kết nối các vùng:
XLB: Ràng buộc này biểu diễn cận dƣới (Lower Bound) của x và có khuôn dạng xc1. XUB: Ràng buộc này biểu diễn cận trên (Upper Bound) của x và có khuôn dạng x<c2. YLB: Ràng buộc này biểu diễn cận dƣới của y và có khuôn dạng yc3.
YUB: Ràng buộc này biểu diễn cận trên của y và có khuôn dạng y<c4. Khi xen nút ta chỉ phải làm nhƣ sau đây:
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Với gốc cây: đặt - vào XLB và YLB, đặt + vào XUB và YUB. Nếu nút N có nút P là cha và mức level(P) là chẵn thì
N.XLB=P.XLB nếu N=P.LLINK N.XLB=P.XVAL nếu N=P.RLINK N.XUB=P.XVAL nếu N=P.LLINK N.XUB=P.XUB nếu N=P.RLINK N.YLB=P.YLB
N.YUB=P.YUB
Nếu nút N có nút P là cha và mức level(P) là lẻ thì N.YLB=P.YLB nếu N=P.LLINK N.YLB=P.YVAL nếu N=P.RLINK N.YUB=P.YVAL nếu N=P.LLINK N.YUB=P.YUB nếu N=P.RLINK N.XLB=P.XLB
N.XUB=P.XUB
Thí dụ sau đây xem xét truy vấn khoảng trên bản đồ một số tuyến phố Hà Nội. Cho trƣớc vòng tròn tâm (35, 46) và bán kính 9.5. Câu trả lời là hai điểm HNgangHBuom và NThuatNSieu sẽ thoả mãn.
Tiến trình truy vấn nhƣ sau. Vùng biểu diễn gốc cây 2-d không cắt vòng tròn, vậy ta kiểm tra xem HDongHCa có trong vòng tròn? Câu trả lời là nó không nằm trong. Tiếp tục xem xét hai cành của HDongHCa, bên trái biểu diễn mọi điểm (x, y) thoả x<19. Vì vùng này không cắt vòng tròn nên ta sẽ không xem xét cành này. Mặt khác cành phía phải của HDongHCa biểu diễn mọi điểm (x, y) thoả x19, chắc chắn nó cắt vòng tròn. Kiểm tra xem cành bên phải (NThuatNSieu) có trong vòng tròn? Câu trả lời là có, vậy ta cho lại mã của nó. Sau đó hãy khảo sát cành của
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
NThuatNSieu. Vùng biểu diễn bởi tập điểm (x, y) thoả x19 và y<50. Vùng này cắt vòng tròn, vậy phải kiểm tra cành có trong vòng tròn? Câu trả lời là có, vậy ta trả lại cành của nó (HNgangHBuom). Hãy xem xét con của HNgangHBuom (DDTuHBuom). Vùng này đƣợc biểu diễn bởi tập điểm (x, y) thoả x38 và y<50, và vùng này cắt đƣờng tròn. Vậy cần kiểm tra xem DDTuHBuom trong vòng tròn? Câu trả lời là không, do vậy có thể dừng tại đây.
Cây k-d với k2
Cây 2-d để biểu diễn điểm trong không gian 2-d. Cây k-d với k2 biểu diễn điểm trong không gian k-d. Thí dụ, cây 3-d biểu diễn các điểm (x, y, z) và cây 4-d biểu diễn điểm dƣới dạng (x, y, x, t)... Tổng quát, điểm trong không gian k-d có dạng (x1, ..., xk), trong đó xi là số thực.
Để biểu diễn nút cây k-d, ta giả sử rằng các trƣờng XVAL, YVAL sử dụng trong cây 2-d bị loại bỏ, thay vì nodetype hay newnodetype sẽ có trƣờng VAL mới. Nó là mảng độ dài k của các số thực.
Cây T có cấu trúc nút nhƣ vậy đƣợc gọi là cây k-d nếu với mỗi nút N trong cây T ta có: Giả sử level(N) mod k=i.
Với mỗi nút M trong cành trái của N ta có M.VAL[i]<N.VAL[i]. Với mỗi nút P trong cành phải N ta có P.VAL[i]N.VAL[i].
Mọi thuật toán của cây 2-d tổng quát hóa cho cây k-d với k2. Nếu k=1 ta có cây tìm kiếm nhị phân chuẩn.