Tải bản đầy đủ (.pdf) (6 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (161.85 KB, 6 trang )

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.

×