1. Trang chủ
  2. » Công Nghệ Thông Tin

MultiBooks - Tổng hợp IT - PC part 10 pptx

6 375 0

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

THÔNG TIN TÀI LIỆU

Nội dung

2. 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 3. 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 đồ Bosnia (hình 2.6). 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 Testic và Derventa 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 Banja Luka 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 Banja Luka, 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 Banja Luka biểu diễn mọi điểm (x, y) thoả x³19, chắc chắn nó cắt vòng tròn. Kiểm tra xem cành bên phải (Derventa) 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 Derventa. Vùng biểu diễn bởi tập điểm (x, y) thoả x³19 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ó (Testic). Hãy xem xét con của Testic (Tuzla). Vùng này được biểu diễn bởi tập điểm (x, y) thoả x³38 và y<50, và vùng này cắt đường tròn. Vậy cần kiểm tra xem Tuzla trong vòng tròn? Câu trả lời là không, do vậy có thể dừng tại đây. 2.2.5 Cây k-d với k³2 Cây 2-d để biểu diễn điểm trong không gian 2-d. Cây k-d với k³2 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 (x 1 , , x k ), trong đó x i 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ó: 1. Giả sử level(N) mod k=i. 2. Với mỗi nút M trong cành trái của N ta có M.VAL[i]<N.VAL[i]. 3. 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 k³2. Nếu k=1 ta có cây tìm kiếm nhị phân chuẩn. 2.3 Cây tứ phân điểm (Point Quadtrees) Một cây tứ phân điểm giống như cây 2-d nó được sử dụng để biểu diễn các điểm dữ liệu trong không gian hai chiều. Có điều không giống như cây 2-d là cây tứ phân điểm luôn phân một vùng thành 4 phần. Trong cây 2-d, nút N phân một vùng thành hai phần do vẽ một đường thẳng đi qua điểm (N.XVAL, N.YVAL). Đường kẻ này có thể là đường nằm ngang nếu cấp của N là lẻ hoặc là đường thẳng đứng trong trường hợp cấp của N là chẵn. Đối với cây tứ phân điểm thì nút N phân một vùng mà nó biểu diễn do vẽ cả đường thẳng đứng và đường nằm ngang qua điểm (N.XVAL, N.YVAL). Bốn phần được tạo ra được gọi là các góc NW (Tây Bắc), SW (Tây Nam), NE (Đông Bắc) và SE (Đông Nam) xác định bởi nút N và mỗi góc tương ứng với một con của nút N. Do đó các nút trong cây bốn nhánh có thể xác định 4 cành. Trước khi thực hiện các thao tác đối với cây bốn cành chúng ta đưa ra định nghĩa đơn giản của cấu trúc nút cho một nút của cây tứ phân như sau: qtnodetype = record INFO : infotype; XVAL: real; YVAL: real; NW, SW, NE, SE : qtnodetype; end 2.3.1 Chèn và tìm kiếm trong cây tứ phân điểm Bây giờ chúng ta hãy khảo sát tập 5 điểm (Banja Luka, Derventa, Teslic, Tuzla và Sinj) đã được thể hiện với cây 2-d, nó sẽ được thể hiện như thế nào thông qua một cây tứ phân. Hình 2.7 thể hiện việc chèn từng điểm vào cây, còn hình 2.8 cho thấy cây tứ phân được xây dựng như thế nào. Tiến trình này được mô tả như sau: 1. Khởi đầu cây tứ phân là rỗng, việc chèn Banja Luka tạo ra nút gốc của cây được gán nhãn với cặp (19, 45). 2. Việc chèn Derventa tạo ra vùng miêu tả bởi Banja Luka được phân thành 4 phần thông qua việc vẽ một đường nằm ngang và một đường thẳng đứng qua (19, 45). Derventa, ở vị trí (40, 50), nằm trong góc phần tư NE, do vậy Banja Error! Luka có con NE là Derventa. 3. Việc chèn Teslic được tiến hành như sau: Teslic nằm theo hướng Đông Nam của Banja Luka. Do vùng này hiện tại chưa có điểm nào nên chúng ta đặt Teslic làm con SE của Banja Luka. 4. Việc chèn Tuzla phức tạp hơn. Chúng ta thấy rằng Tuzla nằm ở SE của Banja Luka. Do vậy chúng ta chuyển đến nhánh SE của Banja Luka. Kết quả là góc phần tư SE được chia bởi vẽ đường nằm ngang và đường thẳng đứng qua điểm Teslic. Với kết quả bốn phần được tạo ra, Tuzla ở góc SE và như vậy Tuzla trở thành nút con SE của Teslic. 5. Cuối cùng, việc chèn Sinj là không quá phức tạp bởi vì nó nằm ở SW của Banja Luka. Do hiện tại con trỏ này là rỗng nên ta đặt nút này chứa thông tin liên quan đến Sinj. Nhìn chung chiều cao của một cây tứ phân chứa n nút có thể có giá trị lớn nhất là n-1, điều đó có nghĩa là thời gian để tìm kiếm hay chèn là nhỏ hơn số lượng nút. 2.3.2 Thao tác xoá trên cây tứ phân điểm Error! Khi xoá nút N từ cây tứ phân có gốc T cũng có những nét giống như chúng ta đã thực hiện với cây 2-d để tìm một nút thay thế thích hợp cho các nút không phải là lá. Đối với trường hợp các nút lá thì việc xoá không có vấn đề gì: Chúng ta đặt trường liên kết tương ứng của nút cha của N trỏ tới NIL và giải phóng không gian lưu trữ. Việc xoá trong cây tứ phân là rất phức tạp. Hình 2.9 chỉ ra tại sao lại phức tạp. Đầu tiên mỗi nút trong cây tứ phân thể hiện một vùng và vùng này được định nghĩa hơi khác hơn so với cây 2-d. Đối với cây 2-d nó đủ để kết hợp 4 ràng buộc dưới dạng x³c 1 , x<c 2 , y³c 3 , y<c 4 với các hằng số c 1 , , c 4 . Do đó như trong trường hợp cây 2-d khi mà chúng ta mở rộng nodetype thành cấu trúc nút mới newnodetype, chúng ta cũng có thể mở rộng cấu trúc nút qtnodetype thành một cấu trúc nút mới newqtnodetype với cùng kiểu trường như trên đây (XLB, YLB, XUB, YUB). newqtnodetype = record INFO: infotype; XVAL, YVAL : real; XLB, YLB, XUB, YUB : real È {-¥, +¥}; NW, SW, NE, SE : newqtnodetype end Khi chèn nút N vào cây T chúng ta cần đảm bảo những điểm dưới đây: 1. Nếu N là gốc của cây T, thì N.XLB=-¥, N.YLB=-¥, N.XUB=+¥, và N.YUB=+¥. 2. Nếu P là cha của N thì khi đó bảng dưới đây mô tả những giá trị của các trường XLB, YLB, XUB, YUB của N tuỳ thuộc vào việc N là con NW, SW, NE hay SE của P. Chúng ta sử dụng ký hiệu w=(P.XUB–P.XLB) và h=(P.YUB – P.YLB). Để vận dụng thành công kỹ thuật xoá trong với cây tứ phân điểm thì khi xoá một nút trong N ta phải tìm một nút thay thế R từ một trong các cây con của N (từ một trong N.NW, N.SW, N.NE, N.SE) sao cho mỗi nút R 1 trong N.NW là ở phía tây bắc của R, mỗi nút R 2 trong N.SW ở phía tây nam R, mỗi nút R 3 trong N.NE ở phía đông bắc của R và mỗi nút R 4 trong N.SE ở phía đông nam của R. Hãy xem xét cây tứ phân trên hình 2.8 và hình 2.9. Giả sử chúng ta muốn xoá Banja Luka từ cây tứ phân này. Trong trường hợp này, nút thay thế thực tế được tìm là Teslic. Không nút nào khác thoả mãn những điều kiện đã đặt ra ở trên. Tuy nhiên, không phải luôn có khả năng tìm được một nút thay thế. Do vậy trong trường hợp xấu nhất việc xoá một nút N có thể yêu cầu việc chèn lại một số nút trong cây con trỏ bởi N.NE, N.SE, N.NW và N.SW. Trong phần sau ta sẽ khảo sát cây tứ phân MX cho phép xóa nút một cách dễ dàng hơn. Trường hợp N.XLB N.XUB N.YLB N.YUB N= P.NW P.XLB P.XLB+w´0.5 P.YLB+h´0.5 P.YUB N= P.SW P.XLB P.XLB+w´0.5 P.YLB P.YLB+h´0.5 N= P.NE P.XLB+w´0.5 P.XUB P.YLB+h´0.5 P.YUB N= P.SE P.XLB+w´0.5 P.XUB P.YLB P.YLB+h´0.5 4.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) . 2.2.5 Cây k-d với k³2 Cây 2-d để biểu diễn điểm trong không gian 2-d. Cây k-d với k³2 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. hơn so với cây 2-d. Đối với cây 2-d nó đủ để kết hợp 4 ràng buộc dưới dạng x³c 1 , x<c 2 , y³c 3 , y<c 4 với các hằng số c 1 , , c 4 . Do đó như trong trường hợp cây 2-d khi mà chúng. thuật toán của cây 2-d tổng quát hóa cho cây k-d với k³2. Nếu k=1 ta có cây tìm kiếm nhị phân chuẩn. 2.3 Cây tứ phân điểm (Point Quadtrees) Một cây tứ phân điểm giống như cây 2-d nó được sử dụng

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

TỪ KHÓA LIÊN QUAN