1
Chương 4:
Các giải thuật hình học
Computational Geometry
PGS. TS. TRẦN CAO ĐỆ
Đại Học Cần Thơ
2013
2
Dữ liệu nhiều chiều
Các giải thuật hình học
liên quan tới dữ liệu
không gian đa chiều.
–
Một điểm trong mặt phẳng (x,y)
–
Một điểm trong không gian (x,y,z)
Các ứng dụng máy
học, xử lí ảnh cần xử lí
dữ liệu hàng trăm, hàng
ngàn chiều.
Các bài toán thống kê,
điều khiển cũng cần xử
lí dữ liệu nhiều chiều
Một số bài toán quan
trọng
–
Tìm kiếm theo phạm vi (range searching
query)
–
Tìm bao lồi (convex hull)
3
Cây tìm kiếm phạm vi
Một điểm trong không
gian d chiều được biểu
diễn theo tọa độ bởi
(x
0
,x
1
,…,x
d-1
).
Tìm kiếm theo phạm vi
là tìm kiếm các điểm
trong một phạm vi nào
đó.
–
Ví dụ tìm các điểm gần với (xq,yq) trong
khoảng cách r.
–
Kết quả tìm kiếm là tất cả các điểm hình
tròn ((xq,yq),r)
Giải thuật tìm kiếm
thường tổ chức dữ liệu
theo cây cân bằng – gọi
là cây TK phạm vi.
4
Tìm kiếm 1 chiều theo phạm vi
Cho một tự điển (tập
hợp các phần tử) có
thứ tự
findAllInRange(k
1
,k
2
):
trả về các phần tử thỏa:
–
k1 ≤ x ≤ k2
Dùng cấu trúc cây
TKNP để lưu trữ các
phần tử
Giải thuật tìm kiếm
1DTreeRangeSearch(k1,k2,v)
–
Nếu v là nút ngoài (V=NULL): dừng
–
Nếu v là nút trong
Key(v)<k1: tìm đệ qui
trên cây phải của v
k
1
≤ key(v) ≤ k
2
: trả ra v
và tìm đệ qui trên cả 2
cây con
Key(v)>k2: tìm đệ qui
trên cây con trái của v.
5
Giải thuật 1DTreeRangeSearch
1DTreeRangeSearch(k1,k2,v){
if v.isExternal(v) return ∅;
if (k1 ≤ key(v) ≤ k2) {
L= 1DTreeRangeSearch(k1,k2,T.leftChild(v));
R= 1DTreeRangeSearch(k1,k2,T.rightChild(v));
return L U {element(v)} U R;
}
else if (key(v) <k1)
return 1DTreeRangeSearch(k1,k2,T.rightChild(v));
else
return 1DTreeRangeSearch(k1,k2,T.leftChild(v));
}
68
2312
21
18
6142
55
49
9074
81
37 99
Cho k1=30, k2=80
Tìm kiếm 1DTreeRangeSearch(k1,k2,T.Root()) sẽ trả ra các nút nằm giữa
hai nút ngoài màu đỏ ở trên.
68
2312
21
18
6142
55
49
9074
81
37 99
Gọi P1 là đường đi khi tìm kiếm trên cây theo khóa k1
Gọi P2 là đường đi khi tìm kiếm trên cây theo khóa k2
Định nghĩa;
–
V là nút biên: nếu v là nút thuộc P1 hoặc P2
–
V là nút trong: nếu v không là nút biên và v là nút thuộc cây con phải của nút thuộc P1 hoặc con trái của nút thuộc P2.
–
V là nút ngoài: nếu v không là nút trong cũng không là nút biên.
8
Hiệu quả của giải thuật
Định lý:
Tìm kiếm 1 chiều theo phạm vi trên một cây TKNP cân bằng có chứa n nút cần:
Không gian lưu trữ O(n)
Thời gian thực hiện 1DTreeRangeSearch là O(logn+s) với s là số phần
tử trả về sau tìm kiếm
Thời gian thực hiện xóa một phần tử là O(logn)
9
Chứng minh
Không duyệt nút ngoài nào
Có nhiều nhất là 2h+1 nút
biên
Mỗi khi duyệt nút trong v, tất
cả các cây con T
v
gốc v
cũng được duyệt và tất cả
các nút của T
v
có trong kết
quả tìm kiếm.
–
Nếu Tv có sv nút thì ta phải duyệt 2sv+1 nút (Sv
nút trong và sv+1 nút ngoài)
–
Các nút trong nằm trên j cây con rời nhau có
nút gốc là con của nút biên và
j ≤ 2h.
–
Gọi si là số nút của cây Ti ta có tổng số nút phải
duyệt là: ∑
j
i=1(2si+1)=2s+j ≤ 2s+2h
Vậy phải duyệt nhiều nhất là
2s+4h+1 tức là O(logn + s)
10
Tìm kiếm 2 chiều theo phạm vi
Cho không gian hai chiều
Mỗi điểm là một cặp (x,y)
FindAllInRange(x
1
,x
2
,y
1
,y
2
): Tìm kiếm tất cả các cặp thỏa:
–
x1 ≤ x ≤ x2
–
y1 ≤ y ≤ y2
11
Tổ chức dữ liệu tìm kiếm 2 chiều theo
phạm vi
Tổ chức dữ liệu lưu trữ
tự điển chứa các phần
tử (x,y)
–
Cấu trúc chính : Cây TKNP (cân bằng)
theo x. Kí hiệu T
–
Cấu trúc phụ: gắn vào mỗi nút của cấu trúc
chính là một cây TKNP (cân bằng) theo y.
kí hiệu T(v) là cây gắn với nút v.
Mỗi nút của cấu trúc
chính (cây T) lưu trữ
–
Một phần tử có tọa độ x(v), y(v) và giá trị
element(v), VÀ
–
Cây tìm kiếm một chiều theo y, kí hiệu T(v)
chứa các phần tử như cây con của T gốc v
với các khóa là tọa độ y.
12
Ví dụ minh họa cây tìm kiếm 2 chiều
theo phạm vi
Các phần tử (30,20), (15,40), (35,2), (5,33), (20,50)
30
35
205
15
Cấu trúc chính là một cây TKNP
(cân bằng) theo tọa độ x
20
40
33
2
50
2
40
33
50
5033
13
Xây dựng cây TK 2 chiều
Cây tìm kiếm hai chiều theo phạm vi chứa n nút cần dùng không gian
O(nlogn) và có thể xây dựng trong thời gian O(nlogn)
–
Cấu trúc chính dùng O(n) không gian
–
Cấu trúc phụ dùng không gian tỷ lệ với số nút lưu trữ. Một nút v trên cây T có thể có O(logn) tiền bối
v được copy O(logn) lần
Không gian lưu trữ O(nlogn)
–
Thời gian xây dựng cũng là O(nlogn).
14
Tìm kiếm 2 chiều theo phạm vi
FindAllInRange(x1,x2,y1,y2)
Tìm một xe mô tô giá
25tr40tr, tiêu thụ xăng 40-
50km/lít.
Giải thuật
–
Tìm trên cấu trúc chính [x1,x2]
–
Khi tìm thấy một nút trong v, tìm đệ qui trên cấu
trúc phụ [y1,y2]
Nút phân phối (allocation
node) : nút trong+nút con
của nút biên.
Các nút biên chia làm 3
nhóm
–
Nút giữa: giao của P1 và P2
–
Nút trái: nút thuộc P1 nhưng không thuộc P2
–
Nút phải: thuộc P2 nhưng không thuộc P1.
Với mỗi nút phân phối: tìm
trên cấu trúc phụ [y1,y2].
Ví dụ minh họa
Nút phân phối
Nút biên
16
Giải thuật tìm kiếm
2DTreeRangeSearch(x1,x2,y1,y2,v,t)
–
Input: cho các khóa x1,x2,y1,y2 và cấu trúc chính T; v là nút trên T; t là kiểu của nút
–
Output: tập hợp các nút v mà các nút thuộc cây con gốc v có tọa độ thỏa mãn x1 ≤ x ≤ x2 và
y1 ≤ y ≤ y2
2DTreeRangeSearch(x1,x2,y1,y2,v,t){
If T.isExternal(v) return ∅;
If (x
1
≤ x(v) ≤ x
2
) {
if (y
1
≤ y(v) ≤ y
2
)
M=[element(v)]
else M= ∅;
if (t==“left”){
L=2DTreeRangeSearch(x1,x2,y1,y2,T.leftChild(v),”left”)
R=1DTreeRangeSearch(y1,y2,T.rightChild(v))
} else if (t==“right”){
L=1DTreeRangeSearch(y1,y2,T.leftChild(v))
R=2DTreeRangeSearch(x1,x2,y1,y2,T.rightChild(v),”right”)
} else { //t==“middle”
L=2DTreeRangeSearch(x1,x2,y1,y2,T.leftChild(v),”left”)
R=2DTreeRangeSearch(x1,x2,y1,y2,T.rightChild(v),”right”)
}
}
else { //của if đầu tiên
M= ∅;
if (x(v) < x1){
L= ∅;
R=2DTreeRangeSearch(x1,x2,y1,y2,T.rightChild(v),t);
} else { //x(v) > x2
L=2DTreeRangeSearch(x1,x2,y1,y2,T.leftChild(v),t);
R= ∅;
}
}
Return L U M U R;
Gọi lần đầu tiên:
2DTreeRangeSearch(x1,x2,y1,y2,T.root(),”middle”);
19
Hiệu quả của giải thuật
Giải thuật tìm kiếm 2 chiều theo phạm vi chứa n
phần tử lấy thời gian O(log
2
n+s) với s là số phần tử
trả về sau tìm kiếm.
Chứng minh: xem trang 554-Goodrich
–
O(logn) nút biên
–
Mỗi nút phân phối (allocation) v duyệt 1 chiều mất O(lognv+sv), nv là số nút trên cây Tv (cấu trúc phụ)
–
Có O(logn) nút allocation
Thời gian O(log
2
n+s)
20
Cây tứ phân (Quadtrees)
Trong các bài toán xử lí ảnh
–
Xử lí các điểm có tọa độ hạn chế (2048x2048)
–
Các điểm tập trung
Xét các điểm trong mặt phẳng
(x,y)
Cây tứ phân là cây
–
mỗi nút trong ứng với một vùng hình vuông R
–
Các nút con của một nút tương ứng với 4 hình vuông
con ở 4 góc của R.
–
Các nút được phân chia một cách đệ qui để mỗi vùng
chứa 1 điểm. Vùng chứa 1 điểm coi như là một nút
ngoài.
r
r1r2 r4r3
21
Ví dụ
f
a
mk
bd
jil g h
ec
Nút trong
Nút ngoài
22
Hiệu quả cây tứ phân
Nếu có hai điểm rất gần nhau thì thời gian xây dựng cây sẽ rất lâu
Thiết kế một biên (bound) D, chiều sâu giới hạn.
Thời gian xây dựng cây tứ phân cho n điểm trong mặt phẳng là
O(D*n), D là chiều sâu giới hạn của cây.
23
Tìm kiếm trên cây tứ phân
Tập S các điểm
Giả sử câu truy vấn là hình
chữ nhật A
Kết quả tìm kiếm là tất cả
các điểm thuộc S nằm trong
A.
Tìm kiếm
–
Bắt đầu từ gốc r của cây.
–
Nếu vùng R (tương ứng với r) ∩ A = ∅ : dừng
–
Nếu R ⊆ A: tất cả các nút lá của cây gốc r đều
là kết quả.
–
Nếu R ∩ A ≠ ∅: tìm kiếm đệ qui trên mỗi con v
của nút r.
Thời gian tìm kiếm là
O(D*n), với n là số nút
ngoài.
–
Giải thuật tìm kiếm có thời gian > thời gian của
giải thuật tìm brute forte!
–
Trong thực hành thì TK trên cây tứ phân nhanh
hơn tìm kiếm brute forte!
24
k-d-Trees
Cây tứ phân không thể
tổng quát hóa cho
nhiều chiều.
–
KG 3 chiều mỗi nút có 8 nút con;
–
KG d chiều, mỗi nút có 2
d
nút con.
Cây k-d: là cây nhị
phân được xây dựng
khá tương tự với cách
xây dựng cây tứ phân.
–
Mỗi nút tương ứng với một vùng hình chữ
nhật
–
Phân chia không gian chứa các điểm
thành các hình chữ nhật, mỗi hình chứa 1
điểm.
25
Hai loại cây k-d
Dựa trên vùng (region
based)
–
Chia vùng HCN thành hai HCN theo trục
dài nhất. Nếu có nhiều trục dài bằng nhau
thì chia xoay vòng theo các trục.
Dựa trên điểm (point-
based)
–
Chia theo phân phối điểm. Mỗi HCN chứa
phân nửa số điểm