– 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... Tìm kiếm 1 chiều theo phạm vi Cho một
Trang 1Các giải thuật hình học Computational Geometry
TS Trần Cao Đệ
Trang 2– 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)
Trang 3Câ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.
Trang 4Tì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ự
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
k1 ≤ key(v) ≤ k2: 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.
Trang 5return 1DTreeRangeSearch(k1,k2,T.rightChild(v)); else
return 1DTreeRangeSearch(k1,k2,T.leftChild(v)); }
Trang 623 12
21
18
61 42
55
49
90 74
Trang 723 12
21
18
61 42
55
49
90 74
81
– 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.
Trang 8Hiệu quả của giải thuật
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:
tử trả về sau tìm kiếm
Trang 9– 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à
Trang 10Tìm kiếm 2 chiều theo phạm vi
FindAllInRange(x1,x2,y1,y2): Tìm kiếm tất cả các cặp thỏa:
– x1 ≤ x ≤ x2
– y1 ≤ y ≤ y2
Trang 11kí 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
Trang 12Cấ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
50 33
Trang 13Xây dựng cây TK 2 chiều
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)
Trang 1440- 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].
Trang 15Ví dụ minh họa
Nút phân phối
Nút biên
Trang 16Giải thuật tìm kiếm
– 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
Trang 17} 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”) }
}
Trang 18else { //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= ∅ ;
Trang 19Hiệ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
Trang 20Cây tứ phân (Quadtrees)
– Xử lí các điểm có tọa độ hạn chế (2048x2048)
– Các điểm tập trung
(x,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
r1
r3
Trang 21Ví dụ
f
a m k
b d
j i
e c
Nút trong Nút ngoài
Trang 22Hiệu quả cây tứ phân
O(D*n), D là chiều sâu giới hạn của cây.
Trang 23– 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
– 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!
Trang 24k-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ó 2d 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
Trang 25Hai 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 based)
(point-– Chia theo phân phối điểm Mỗi HCN chứa phân nửa số điểm
Trang 26e g c p j f n l h a k m i b o d
Trang 27– Tìm kiếm (từ nút gốc) nút ngoài v tương ứng với vùng R nhỏ nhất chứa p.
– Các điểm thuộc R và thuộc các vùng tương ứng với nút anh em của v đều được so sánh để tìm điểm
q gần nhất hiện tại
– Định nghĩa hình tròn s(p,pq)
– Duyệt cây tìm các vùng giao với s khác rỗng
– Trong khi duyệt nếu tìm thấy điểm q’ gần p hơn q, thay q=q’
Trang 29Kỹ thuật trượt phẳng (Plane sweep technique)
tưởng: 1 chiều hóa bài toán 2 chiều
Trang 30Giao đoạn thẳng trực giao
Bài toán tổng quát: Cho n
đoạn thẳng, tìm giao của tất
cả các cặp đoạn thẳng
– Brute forte: xét n(n-1)/2 cặp, thời gian O(n2)
Bài toán hạn chế: cho n
đoạn thẳng trực giao, nghĩa
là các đoạn song song với
Trang 31Giải thuật trượt phẳng
Cho trượt đường thẳng l thẳng đứng từ trái sang phải.
Khi trượt, lưu các đoạn đang có giao điểm với l vào
tự điển S (tổ chức có thứ tự theo tọa độ y)
Các sự kiện và hành động:
Gặp đầu trái của đoạn ngang h Thêm h vào tự điển S
Gặp đầu phải của đoạn ngang h Loại h khỏi tự điển S
Gặp đoạn thẳng thẳng đứng v Thực hiện tìm kiếm theo phạm
vi trên S với phạm vi là tọa độ y của hai đầu điểm v
Trang 32Hiệu quả
trực giao cho trước là O(nlogn+s), với s là số giao điểm.
Trang 33– Lưu giữ các cặp điểm gần nhất và các điểm gần với đường quét
Trang 34 Như vậy, khi quét ngang 1
điểm p phải thực hiện các phép toán sau:
– Loại bỏ khỏi S các điểm r thỏa: x(p)-x(r) > d
– Tìm điểm q trong S sao cho d(p,q)<d Cập nhật lại a=p, b=q và d=d(p,q)
– Insert p vào S.
Trang 35Đường quét
d Vùng khảo sát
d
Trang 36Nhận xét
Rõ ràng mỗi lần quét
qua một điểm p ta chỉ xét các điểm trong S và cần tìm điểm q với
d(p,q)<d
– Các điểm cần xét thuộc hình chữ nhật B(p,d) kích thước dx2d
– Điểm q cần tìm thuộc giao của B(p,d) với nửa hình tròn (p,d)
Với mỗi điểm thuộc S, thực hiện tìm kiếm theo phạm vi với các khóa là tọa độ y.
Tổ chức cây tìm kiếm là AVL hoặc red-black lưu trữ S.
p
q
Trang 37Định lý
giữa hai điểm bất kỳ ít nhất là d.
là O(logn+6) đó là thời gian 1DRangeSearchTree.
p
q
Trang 38– Xác định điểm kế tiếp được xử lí (được quét)
– Xác định điểm bị loại khỏi S.
Gọi FirstIntrip và LastInTrip
là điểm đầu tiên và cuối cùng trong các điểm đang xét (theo thứ tự)
– Nếu X(FirstInTrip) < x(lastInTrip)-d, thì
ta loại FirstInTrip
FirstInTrip=Next(FirstInTrip)
– Sắp xếp các điểm O(nlogn)
– Thêm/xóa một phần tử vào/từ S là O(logn)
– Thực hiện tìm kiếm phạm vi trong S là O(logn)
– Thực hiện tìm kiếm khi quét qua n điểm O(nlogn).
Trang 39Tìm bao lồi (convex Hull)
Cho n>3 điểm (không
thẳng hàng) trong mặt phẳng, tìm đa giác lồi:
– có các đỉnh thuộc tập các điểm đã cho,
– chứa tất cả các điểm đã cho
Đa giác là một chuỗi
khép kín các đỉnh đa giác
– Đa giác đơn: giao của hai cạnh bất kỳ (nếu có) là đỉnh của đa giác
– Đa giác lồi nếu nó là đơn và mọi góc trong đều nhỏ hơn π
Trang 40– (p,q,r) là “cua phải” nếu chúng có hướng cùng chiều kim đồng hồ, tức là góc (p,q,r) < π nằm bên phải pq
– nếu (p,q,r)= π thì 3 điểm thẳng hàng.
p
q r
p
q
r
Trang 41dương, âm hoặc bằng 0 tương ứng
Trang 42Kiểm tra hai đoạn thẳng giao nhau
Cho hai đoạn thẳng s1=p 1 q 1 ,s2=p 2 q 2 s1 và s2 giao
nhau nếu một trong các điều kiện sau thỏa:
1. (p1,q1,p2), (p1,q1,q2) khác hướng VÀ (p2,q2,p1), (p2,q2,p2) khác hướng.
2. (p1,q1,p2), (p1,q1,q2), (p2,q2,p1) và (p2,q2,q1) thẳng hàng, VÀ
hình chiếu lên trục x của s1 và s2 là giao nhau, VÀhình chiếu của s1 và s2 lên trục y là giao nhau
Trang 43Tính chất cơ bản của bao lồi
Vùng R là lồi nếu hai điểm
p,q thuộc R thì cả đoạn thẳng pq thuộc R.
– Điểm p là một đỉnh của bao lồi nếu và chỉ nếu tồn tại một đường thẳng l đi qua p sao cho tất
cả các điểm khác p thuộc về nửa mặt phẳng xác định bởi l
– Điểm p không phải là đỉnh của H nếu và chỉ nếu
p chứa trong một tam giác có 3 đỉnh là 3 điểm khác trong S hoặc p thuộc một đoạn thẳng nối hai đỉnh khác
Trang 45Giải thuật “gói quà” (gift wrapping)
Chọn điểm A(xmin,ymin), A là
một đỉnh của bao lồi, gọi là điểm neo (anchor)
Xét tia Ax
Quay tia Ax ngược chiều
kim đồng hồ cho đến khi gặp một điểm B B là đỉnh
kế tiếp A trên bao lồi Thay A bởi B và tiếp tục quay tia Ax.
Cho đến khi điểm B tìm thấy
trùng với điểm neo.
A
B
A
B
Trang 46Định lý
của S, điểm p là đỉnh kế tiếp trên bao lồi khi quay ngược chiều kim đồng hồ thì (a,p,q) là “cua trái” với mọi điểm q của S.
C(a).isLess(p,q) nếu và chỉ nếu (a,p,q) là một “cua trái”
Trang 47 Gọi p0,p1,…,ph-1 là các đỉnh bao lồi.
Thời gian tìm điểm neo p0 là O(n)
Ở bước i: thời gian tìm đỉnh
kế tiếp (tính C(pi-1)) là O(n)
Có h đỉnh phải tìm vậy thời gian là O(hn)
Trong trường hợp xấu nhất h=n thì thời gian “gói quà” là O(n2)
Trang 48Giải thuật quét Graham (Graham Scan)
Cho tập P các điểm trong
mặt phẳng
Giải thuật tìm bao lồi H
– Tìm một điểm A nằm trên bao lồi, gọi là điểm neo; ví dụ điểm có tọa độ y nhỏ nhất Thêm A vào H
– Sắp xếp các điểm P-{A} theo C(A), tức là góc của hợp phương ngang (tia Ax).
– Xét các điểm p ∈ P-{A} theo thứ tự trên
hơn 2 điểm hoặc Nếu p hợp với hai điểm trước đó làm thành một cua trái
H trong trường hợp ngược lại và lặp lại test đối với p
Trang 49Giải thuật quét Graham
Scan(S,a){
//Input: S là danh sách có thứ tự theo chiều ngược chiều kim đồng hồ; a là điểm neo//Output: S chứa các đỉnh của bao lồi (các đỉnh còn lại sau khi thực hiện giải thuật)
S.Append(a) Prev=S.first();//prev=a Curr=S.after(prev);
Do{
next=S.after(curr)
if isLeftturn(prev,curr,next) prev=curr else{
S.remove(curr);
prev=S.before(prev);
} curr=S.after(prev) } while curr!=S.last() S.Remove(S.last());//xóa điểm neo a
}
Trang 50Hiệu quả của giải thuật quét Graham
Trang 51Cài đặt giải thuật quét Graham
Trang 52Hết chương 5