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

TÌM CẶP ĐIỂM GẦN NHẤT VỚI GIẢI THUẬT VÉT CẠN VÀ CHIA ĐỂ TRỊ

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 (590.69 KB, 6 trang )

TÌM CẶP ĐIỂM GẦN NHẤT VỚI GIẢI THUẬT
VÉT CẠN VÀ CHIA ĐỂ TRỊ
Giảng viên hướng dẫn: Phó Giáo sư Tiến sĩ Trần Cao Đệ
Nhóm thực hiện:
Vương Huỳnh Long
1
- Nguyễn Ngọc Giàu
1
- Phạm Thị Cẩm Tú
1
Quách Luyl Đa
1
- Nguyễn Hoàng Tiển
1
- Lê Thị Thùy Vân
2
1
Lớp: Hệ thống thông tin K19
2
Lớp: Hệ thống thông tin K18
Tóm tắt nội dung Tìm cặp điểm gần nhất là một bài toán kinh điển trong khoa học
máy tính. Hiện nay, có nhiều thuật toán để giải bài toán này, tuy nhiên bài báo chỉ trình
bày hai phương pháp giải: phương pháp Vét cạn và phương pháp Chia để trị. Với từng
phương pháp, bài báo trình bày ý tưởng, giải thuật bằng mã giả, độ phức tạp lý thuyết,
kết quả thực nghiệm của phương pháp khi giải bài toán Tìm cặp điểm gần nhất. Cuối
cùng, từ độ phức tạp lý thuyết và kết quả thực nghiệm làm cơ sở đưa ra kết luận về tính
hiệu quả của hai giải thuật.
Keywords: Cặp điểm gần nhất, vét cạn, chia để trị, closest pair, brute force, divide and
conquer
1 Phát biểu bài toán
Cho tập P = {p


1
, p
2
, , p
n
} với p
i
= (x
i
, y
i
) và d(p
i
, p
j
) là khoảng cách Euclidean giữa điểm p
i
và p
j
. Hãy tìm ra một cặp điểm p
i
và p
j
sao cho d(p
i
, p
j
) là nhỏ nhất, tức là p
i
và p

j
là 2 điểm
gần nhất.[1]
Hình 1. Cặp điểm gần nhất có màu đỏ
2 Lịch sử giải quyết bài toán
– Giải thuật Vét cạn: giải thuật này không có tác giả. Độ phức tạp của giải thuật là O(n
2
).
– Giải thuật Chia để trị: giải thuật này do Bentley và Shamos trình bày năm 1976. Độ
phức tạp của giải thuật là O(n log n). [2]
– Giải thuật cải tiến từ Chia để trị của Bentley và Shamos: giải thuật này do Moham-
mad Zaidul Karim và Nargis Akter đề xuất. Giải thuật này chia bài toán thành n phần thay
vì 2 phần. Giải thuật này trong nhiều trường hợp có độ phức tạp nhỏ hơn O(n log n). [3]
3 Tìm cặp điểm gần nhất bằng giải thuật Vét cạn
3.1 Ý tưởng
Ý tưởng giải thuật Vét cạn gồm 03 bước, cụ thể như sau:
2 Tìm cặp điểm gần nhất với giải thuật vét cạn và chia để trị
1. Tính tất cả các khoảng cách giữa các điểm trong tập P.
2. Xác định khoảng cách nhỏ nhất trong các khoảng cách vừa tìm được.
3. Cặp điểm có khoảng cách ngắn nhất là cặp điểm gần nhất.
Ví dụ: cho một phẳng gồm các điểm như Hình 2
Hình 2. Mặt phẳng gồm 5 điểm
1. Lần lượt tính các khoảng cách: AB, AC, AD, AE, BA, BC, BD, BE, CA, CB, CD, CE, DA,
DB, DC, DE, EA, EB, EC, ED
2. Giá trị đoạn BC là nhỏ nhất
3. B và C là cặp điểm ngắn nhất
Mặt phẳng có 5 điểm, với mỗi điểm cần tính khoảng cách của nó với 4 điểm còn lại nên cần 20
phép tính khoảng cách. Tổng quát hóa, với mặt phẳng có n điểm, mỗi điểm cần tính khoảng cách
với (n − 1) điểm còn lại. Vậy, số phép tính khoảng cách trong mặt phẳng có n điểm là n(n − 1)
phép tính. Tuy nhiên, nhận thấy có sự lặp lại trong quá trình tính toán các khoảng cách và số

phép tính lặp lại này chiếm một nửa các phép tính khoảng cách nên loại bỏ các phép tính bị
trùng thì số phép tính khoảng cách cần thiết là
n(n−1)
2
.
3.2 Giải thuật
Algorithm 1 Thuật toán tìm cặp điểm gần nhất bằng vét cạn.
1: procedure BruteForce(P)
2: mindist = ∞
3: n = P.Count
// P.Count là số lượng điểm của tập P
4: for i = 1 n − 1 do
5: for j = i + 1 n do
6: d = dist(P
i
, P
j
)
7: if (d < mindist) then
8: mindist = d
9: closestP air = (P
i
, P
j
)
10: end if
11: end for
12: end for
13: return closestP air
14: end procedure

3.3 Độ phức tạp
Độ phức tạp của giải thuật được tính như sau:
– Độ phức tạp của chương trình con dist (phép tính căn và bình phương) là O(1).
– Độ phức tạp của các lệnh 2, 3, 5, 7, 8, 9 là O(1).
– Độ phức tạp của lệnh 5 là O(n − i).
– Độ phức tạp của lệnh 4, cũng chính là độ phức tạp của toàn chương trình
T (n) =

i=1
n − 1(n − i) =
n(n − 1)
2
= O(n
2
)
.
Vậy, độ phức tạp của thuật toán Vét cạn cho bài toán tìm cặp điểm gần nhất là T (n) = O(n
2
).
Tìm cặp điểm gần nhất với giải thuật vét cạn và chia để trị 3
4 Chia để trị
Bài báo trình bày thuật toán Chia để trị do hai tác giả Bentley và Shamos trình bày lần đầu
tiên vào năm 1976.
4.1 Ý tưởng giải thuật
Ý tưởng giải thuật Chia để trị gồm 07 bước, cụ thể như sau:
1. Chia P thành thành 2 tập có số lượng điểm bằng nhau. Điểm chia cắt gọi là x
med
2. Tìm cặp điểm gần nhất trong nửa trái có khoảng cách là d
L
.

3. Tìm cặp điểm gần nhất trong nửa phải có khoảng cách là d
R
.
4. Tính d = min(d
L
, d
R
).
5. Tạo tập P
LR
= các điểm P
i
có tọa độ x thuộc [x
med
− d, x
med
+ d]
6. Tìm cặp điểm gần nhất trong tập P
LR
có khoảng cách là d
LR
.
7. So sánh d
L
, d
R
, d
LR
sẽ tìm ra được cặp điểm gần nhất.
Ví dụ: Cho mặt phẳng P như hình 3

Hình 3. Mặt phẳng P gồm 7 điểm
Điểm chia cắt là điểm P
4
, nửa vùng bên trái là các điểm P
2
, P
3
, P
7
, nửa vùng bên phải là các
điểm P
5
, P
1
, P
6
. Khoảng cách ngắn nhất trong nửa trái, nửa phải lần lượt là d
L
= dist(P
2
, P
3
)
và d
R
= dist(P
1
, P
6
) nên d = min(d

L
, d
R
) = d
R
. Từ d tìm được các điểm P
LR
= {P
4
, P
5
, P
7
} là
các điểm có tọa độ x ∈ [x
med
− d, x
med
+ d] trong tập P . Tiếp tục tìm đoạn ngắn nhất trong
P
LR
là d
LR
= dist(P
4
, P
7
). Từ phép tính min(d
L
, d

LR
, d
R
) = d
LR
→ đoạn ngắn nhất là đoạn
d
LR
, nên cặp điểm gần nhất là (P
4
, P
7
).
Hình 4. Cặp điểm gần nhất (P
4
, P
7
)
4 Tìm cặp điểm gần nhất với giải thuật vét cạn và chia để trị
4.2 Giải thuật
Algorithm 2 Thuật toán tìm cặp điểm gần nhất bằng Chia để trị
Prepair: P
X
= P.OrderBy(p => p.X); P
Y
= P.OrderBy(p => p.Y )
1: procedure ClosestPair(P
X
, P
Y

)
2: if (P
X
.Count <= 3) then
3: return BruteForce(P
X
)
4: end if
5: n = P
X
.Count/2 ; d
LR
= ∞
6: P
Lef t
= P
X
.T ake(0, n − 1) ; P
Right
= P
X
.Skip(n, P
X
.Count)
7: d
L
= ClosestP air(P
Lef t
, P
Y

) ; d
R
= ClosestP air(P
Right
, P
Y
)
8: d = min(d
L
, d
R
)
9: P
LR
= P
Y
.W here(p => abs(P
X
[n].X − p.X) <= d)
10: for each p
i
∈ P
LR
do
11: for j = i + 1 i + 5 do
12: if dist(p
i
, p
j
) < d then

13: d
LR
= dist(p
i
, p
j
)
14: d = d
LR
15: end if
16: end for
17: end for
18: return min(d
L
, d
LR
, d
R
)
19: end procedure
4.3 Độ phức tạp
Gọi T(n) là độ phức tạp của giải thuật với dữ liệu đầu vào n. Xét:
– Khi số điểm ≤ 3 thì dừng đệ quy và tính khoảng cách giữa 3 điểm bằng Vét cạn, tốn O(1).
– Quá trình đệ quy (chia để trị):
1. Chia: Xác định điểm phân giới n trên tập P
X
, tốn O(1).
2. Trị: Đệ quy trên nửa trái, nửa phải, tốn 2T (n/2).
3. Tổng hợp: là thời gian tìm ra d
LR

• d = min(d
L
, d
R
) → tốn O(1).
• P
LR
= P
Y
.W here(p => abs(P
X
[n].X − p.X) <= d) → tốn O(n).
Hình 5. Chỉ có 6 điểm tạo ra khoảng cách bằng d trong hình chữ nhật (d, 2d)
• Trong một hình chữ nhật kích thước (d, 2d) như Hình 5 thì chỉ có 6 điểm tạo ra
khoảng cách bằng với d. Mặt khác, các điểm trong tập P
LR
được sắp xếp tăng dần
theo tọa độ Y nên với một điểm thuộc P
LR
chỉ cần tính khoảng cách từ nó với 5
điểm lân cận kế tiếp. Tốn O(5n) → O(n).
→ độ phức tạp cho quá trình tổng hợp là O(n).
– Thành lập và giải phương trình cho thuật toán chia để trị:
T (n) =

1 if n ≤ 3
2T (
n
2
) + n if n > 3

→ O(n log n)
Vậy, độ phức tạp của khi áp dụng Chia để trị cho bài toán này là T (n) = O(n log n).
Tìm cặp điểm gần nhất với giải thuật vét cạn và chia để trị 5
5 Thực nghiệm
Theo lý thuyết, khi giải bài toán tìm cặp điểm gần nhất, độ phức tạp của thuật toán Vét cạn là
O(n
2
) và thuật toán Chia để trị là O(n log n), tức là thuật toán Chia để trị tốt hơn thuật toán
Vét cạn. Như vậy, cần cài đặt hai giải thuật Vét cạn và Chia để trị . Áp dụng hai giải thuật này
lên nhiều tập dữ liệu khác nhau với các tiêu chí đánh giá hợp lý nhằm kiểm tra tính đúng đắn
của lý thuyết.
5.1 Phương pháp sinh dữ liệu
– Sinh ngẫu nhiên.
– Không trùng.
– Khoảng cách ngắn nhất giữa các điểm là 20 pixel.
– Tọa độ các điểm nằm trong ‘khung chứa ảnh’ của chương trình DEMO.
– Sinh đủ số lượng điểm yêu cầu thì dừng.
5.2 Các tiêu chí đánh giá
– Kết quả của hai thuật toán phải giống nhau trong mọi trường hợp.
– Trong đa số trường hợp thì thuật toán Chia để trị có thời gian chạy máy ít hơn Vét cạn.
– Khi dữ liệu lớn dần thì cả hai thuật toán đều có thời gian chạy máy tăng lên, nhưng thuật
toán Vét cạn có thời gian chạy máy tăng rất nhanh (O(n
2
) tức là cho kết quả chậm khi dữ
liệu lớn), còn chia để trị thì tăng không đáng kể (O(n log n) ).
5.3 Các chiến lược đánh giá
Chiến lược 1:
– Mục đích: Cho thấy với tập dữ liệu có số điểm ‘đủ lớn’ thì Chia để trị tìm ra cặp điểm
nhanh hơn Vét cạn
– Phương pháp:

input: N tập dữ liệu, mỗi tập có kích thước K
output: Xuất kết quả để so sánh và vẽ đồ thị
procedure TestCase1(N)
for n ∈ N do
kq_BF.Add(BruteF orce(n))
kq_DC .Add(DivideAndConquer(n))
end for
GhiFile(kq_BF+kq_DC,‘kq.xml’)
end procedure
– Kết quả:
Hình 6. Bên trái là kết quả chạy 30 tập dữ liệu, mỗi tập có 300 điểm, bên phải là kết quả chạy của 30
tập dữ liệu, mỗi tập có 500 điểm, đường màu xanh là thời gian chạy của Chia để trị, đường màu nâu là
thời gian chạy của Vét cạn
6 Tìm cặp điểm gần nhất với giải thuật vét cạn và chia để trị
Chiến lược 2:
– Mục đích: Cho thấy khi dữ liệu tăng dần thì Vét cạn chạy lâu hơn Chia để trị nhiều lần →
Lý thuyết ≈ Thực nghiệm
– Phương pháp:
input: K
min
, K
max
: K.thước dữ liệu nhỏ nhất, lớn nhất
k : bước tăng
output: Xuất kết quả để so sánh và vẽ đồ thị
procedure TestCase2(N)
for i = K
min
; i < K
max

; i = i + k do
kq_BF.Add(BruteF orce(i))
kq_DC .Add(DivideAndConquer(i))
end for
GhiFile(kq_BF+kq_DC,‘kq.xml’)
end procedure
Hình 7. Bên trái là kết quả chạy của tập dữ liệu từ 10, 15, 20, , 200 điểm. Bên trái là kết quả chạy
của tập dữ liệu từ 100,120,140, , 300 điểm
6 Kết luận
– Về lý thuyết:
• Vét cạn: O(n
2
).
• Chia để trị: O(nlogn).
– Về thực nghiệm: dựa vào kết quả đồ thị.
• Khi tập dữ liệu nhỏ thì thời gian chạy của hai thuật toán không chênh lệch, nhưng khi
dữ liệu đủ lớn thì giải thuật Chia để trị chạy nhanh hơn giải thuật Vét cạn. Hình minh
họa: 6.
• Khi tập dữ liệu lớn dần thì cả hai giải thuật đều có thời gian chạy máy tăng nhưng:
∗ Vét cạn: tăng rất nhanh.
∗ Chia để trị: tăng rất chậm.
∗ Hình minh họa: 7.
Từ kết quả tính toán trên lý thuyết và kết quả thực nghiệm, nhận thấy rằng để giải quyết bài
toán Tìm cặp điểm gần nhất với tập dữ liệu đủ lớn, thuật toán Chia để trị cho kết quả tốt hơn
thuật toán Vét cạn rất nhiều lần về mặt thời gian.
Tài liệu
1. T. C. Đệ, Phân tích và Thiết kế Giải thuật nâng cao. 01, Lý Tự Trọng, Cần Thơ, Việt Nam: Đại
học Cần Thơ, 2012.
2. J. L. Bentley and M. I. S. (1976), “Proceedings of the 8th annual acm symposium on theory of
computing,” in STOC ’76. New York, NY, USA: ACM, pp. 220–230.

3. N. A. Mohammad Zaidul Karim, “Optimum partition parameter of divide and conquer algorithm for
solving closest pair problem,” International Journal of Computer Science and Information Technology
(IJCSIT) Vol 3, No 5, Oct 2011, vol. 3, pp. 211–219, Oct 2011.

×