Tải bản đầy đủ (.ppt) (52 trang)

Bài giảng Phân tích và Thiết kế giải thuật nâng cao: Chương 4 PGS.TS. Trần Cao Đệ

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 (174.3 KB, 52 trang )

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á
25tr40tr, 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

×