bài toán tìm bao lồi
TRANSCRIPT
BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC KHOA HỌC
NGUYỄN KIỀU LINH
BÀI TOÁN TÌM BAO LỒI
LUẬN VĂN THẠC SỸ
Chuyên ngành : TOÁN ỨNG DỤNG
Mã số : 00 00 00
Giáo viên hướng dẫn:
TS. HOÀNG NAM DŨNG
THÁI NGUYÊN, 2012
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Lời cảm ơn
Sau một thời gian cố gắng, nỗ lực học tập và nghiên cứu, đến nay tôi đã hoàn
thành luận văn tốt nghiệp thạc sỹ của mình. Để có được kết quả này, tôi xin
bày tỏ lòng biết ơn sâu sắc và lời cảm ơn chân thành nhất đến thầy tôi, TS.
Hoàng Nam Dũng, người đã định hướng nghiên cứu cho tôi trong suốt thời gian
thực hiện luận văn của mình. Cám ơn thầy đã mang đến cho tôi những bài học
quý báu về phương pháp nghiên cứu khoa học. Đó chính là nền tảng cơ bản,
là những hành trang vô cùng quý giá để tôi có thể tiếp cận được với khoa học
thật sự. Thầy đã dạy cho tôi không chỉ những kiến thức khoa học mà còn cả
những bài học về cuộc sống, về tình người. Xin cảm ơn về tất cả những gì thầy
đã mang đến cho tôi.
Tôi xin gửi lời cảm ơn chân thành tới các thầy cô ở trường Đại học Khoa học,
Đại học Thái Nguyên và các thầy cô ở Viện Toán học đã luôn tận tình giúp đỡ,
theo dõi và động viên cho tôi trong suốt quá trình thực hiện luận văn này.
Xin cám ơn những người thân trong gia đình đã hết sức thông cảm, chia sẻ và
tạo điều kiện tốt nhất cho tôi để tôi có thể học tập, nghiên cứu và hoàn thành
những công việc của mình.
Xin cám ơn tất cả những người bạn thân yêu, những người đã yêu mến, chia
sẻ với tôi những khó khăn vui buồn trong khi tôi thực hiện luận văn này.
2
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Mục lục
1 Bài toán tìm bao lồi và ứng dụng 7
1.1 Bài toán tìm bao lồi . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.1 Tập lồi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.2 Bao lồi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1.3 Bài toán tìm bao lồi . . . . . . . . . . . . . . . . . . . . . . 9
1.2 Ứng dụng của bài toán tìm bao lồi . . . . . . . . . . . . . . . . . . 9
1.2.1 Nhận dạng . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2.2 Tìm đường đi ngắn nhất . . . . . . . . . . . . . . . . . . . . 11
1.2.3 Hệ thống thông tin địa lý (GIS) . . . . . . . . . . . . . . . 12
1.2.4 Thống kê . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.2.5 Tìm đường kính của một tập hợp điểm . . . . . . . . . . . 15
2 Các thuật toán tìm bao lồi 19
2.1 Một số khái niệm và thuật toán cơ bản . . . . . . . . . . . . . . . . 19
2.2 Thuật toán gói quà . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3 Thuật toán quét Graham . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3.1 So sánh hai góc trong mặt phẳng . . . . . . . . . . . . . . . 24
2.3.2 Sắp xếp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.3.3 Thuật toán quét Graham . . . . . . . . . . . . . . . . . . . 29
2.4 Thuật toán Quickhull . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.5 Thuật toán Chan . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3 Cải tiến các thuật toán 39
3.1 Xóa điểm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.2 Cải tiến thuật toán Quickhull . . . . . . . . . . . . . . . . . . . . . 41
4 Kết quả tính toán 45
4.1 Tạo tập hợp điểm ngẫu nhiên và thuật toán xóa điểm . . . . . . . 45
3
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
4.2 Các kết quả tính toán . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Mở đầu
Bài toán tìm bao lồi là một trong những bài toán đặc biệt quan trọng trong
lĩnh vực hình học tính toán bởi các ứng dụng đa dạng của nó. Chẳng hạn như
nhận dạng mẫu, xử lý hình ảnh, tìm đường đi cho robot, số liệu thống kê, . . . .
Hơn nữa bài toán tìm bao lồi còn được áp dụng để tìm ra các bài toán tính toán
hình học khác như tìm tam giác phân Delaunay, tìm đường kính của một tập
hợp, tìm các lớp lồi của một tập hợp, . . . . Vì các ứng dụng quan trọng của nó
nên nhiều nhà khoa học đã bắt tay vào việc nghiên cứu và đưa ra các thuật toán
tìm bao lồi của một tập hợp. Điển hình như sự phát hiện của Chand và Kapur
vào năm 1970 và Jarvis vào năm 1973 với thuật toán gói quà, Ronald Graham
vào năm 1972 với thuật toán quét Graham, W. Eddy năm 1977 và A.Bykat
năm 1978 với thuật toán Quickhull, Timothy Chan vào năm 1993 với thuật toán
Chan, . . . . Hiện nay có rất nhiều nhà khoa học dựa vào các thuật toán này để
cải tiến và tăng tốc cho chúng nhằm đáp ứng các yêu cầu của cuộc sống hiện
đại như xử lí các vấn đề ở tốc độ cao với số lượng lớn. Xuất phát từ lí do trên
luận văn này đưa ra một một số cải tiến nhằm tăng tốc cho việc tính toán khi
tìm bao lồi của một tập hợp điểm trên mặt phẳng.
Luận văn này gồm bốn chương. Chương 1 phát biểu bài toán tìm bao lồi
và trình bày một số ứng dụng quan trọng của bài toán này trong thực tiễn.
Chương 2 trình bày các thuật toán tìm bao lồi trong không gian hai chiều như
thuật toán gói quà, thuật toán quét Graham, thuật toán Quickhull và thuật
toán Chan. Chương 3 đưa ra thuật toán xóa điểm, là thuật toán dựa vào tính
chất của những điểm cực nằm trong tập các đỉnh của bao lồi, để xóa bớt những
điểm nằm trong đa giác tạo bởi các điểm cực, nhằm mục đích giảm bớt số lượng
các điểm đầu vào cho các thuật toán tìm bao lồi. Đồng thời chương này cũng
trình bày một cải tiến cho thuật toán Quickhull. Chương 4 nêu các kết quả tính
toán của các thuật toán đã được trình bày ở chương 3 như thuật toán xóa điểm,
thuật toán Quickhull và Quickhull cải tiến.
Trong quá trình nghiên cứu và tìm tòi để hoàn thành luận văn này, mặc dù
5
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
tác giả đã có nhiều nỗ lực cố gắng, nhưng chắc chắn luận văn sẽ không tránh
khỏi những thiếu sót. Tác giả rất mong nhận được sự góp ý của các thầy cô và
các bạn để luận văn được hoàn thiện hơn.
6
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Chương 1
Bài toán tìm bao lồi và ứng dụng
Như đã biết, bài toán tìm bao lồi là một trong những bài toán đặc biệt quan
trọng trong lĩnh vực hình học tính toán. Chương này phát biểu bài toán tìm bao
lồi và đưa ra một số ứng dụng quan trọng của bài toán trong thực tế.
1.1 Bài toán tìm bao lồi
Trước khi trình bày định nghĩa bài toán tìm bao lồi ta trình bày các khái
niệm tập lồi, tổ hợp lồi, . . . [19].
1.1.1 Tập lồi
Định nghĩa 1.1. Cho hai điểm p, q ∈ Rn. Tập hợp tất cả các điểm x có dạng
x = (1− λ)p+ λq
với 0 ≤ λ ≤ 1 gọi là đoạn thẳng nối p với q và được kí hiệu là pq.
Định nghĩa 1.2. Cho p1, p2, ..., pk ∈ Rn. Những điểm x ∈ Rn có dạng x =k∑
i=1
λipi
trong đó pi ∈ Rn và 0 ≤ λi ≤ 1 vớik∑
i=1
λi = 1 được gọi là một tổ hợp lồi của
p1, p2, ..., pk ∈ Rn.
Định nghĩa 1.3. Một tập S được gọi là một tập lồi nếu cho hai điểm p, q tùy ý
thuộc S thì bất kì tổ hợp lồi nào của p và q cũng nằm trong S hay đoạn thẳng
pq phải nằm hoàn toàn trong S (hình 1.1).
1.1.2 Bao lồi
Sau đây ta trình bày định nghĩa bao lồi và phát biểu bài toán tìm bao lồi
trong không gian Rn bất kỳ.
7
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) Tập lồi (b) Tập không lồi
Hình 1.1
Định nghĩa 1.4. Bao lồi của một tập S hữu hạn điểm là giao của tất cả các
tập lồi chứa S. Ta kí hiệu bao lồi của S là conv(S) (hình 1.2).
Nhận xét 1.1. Bao lồi của tập S là tập lồi nhỏ nhất chứa S. Bao lồi của một
tập hữu hạn điểm P ⊂ Rn là một đa diện lồi trong Rn (hình 1.3).
Định nghĩa 1.5. Mỗi p ∈ P thỏa mãn p /∈ conv(P\{p}) được gọi là một đỉnh
của conv(P ).
Hình 1.2 Bao lồi của một tập hữu hạn
Hình 1.3 Bao lồi của một tập hữu hạn
8
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Nhận xét 1.2. Nếu gọi tập hợp các đỉnh của conv(P ) là H thì ta có
conv(P ) = conv(H).
Định nghĩa 1.6. Trong mặt phẳng, đa giác tạo bởi các đỉnh của một bao lồi
được gọi là biên của bao lồi đó.
1.1.3 Bài toán tìm bao lồi
Cho một tập hợp P hữu hạn điểm, bài toán tìm bao lồi của P là bài toán tìm
tập hợp H các đỉnh của bao lồi conv(P ) của P .
Input: Tập hợp P hữu hạn n điểm p1, p2, ..., pn.
Output: Tập đỉnh của bao lồi conv(P ), H = {h1, h2, ..., hm}(hình 1.4).
(a) Input (b) Output
Hình 1.4
1.2 Ứng dụng của bài toán tìm bao lồi
Bài toán tìm bao lồi của một tập hợp hữu hạn điểm có ứng dụng đa dạng
trong nhiều lĩnh vực chẳng hạn như nhận dạng mẫu, xử lý hình ảnh, tìm đường
đi cho robot, số liệu thống kê, . . . . Bài toán tìm bao lồi còn được áp dụng rộng
rãi để tìm ra các bài toán tính toán hình học khác và các bài toán này có rất
nhiều ứng dụng trong thực tế như bài toán tìm tam giác phân Delaunay, bài
toán tìm đường kính của một tập hợp, bài toán tìm các lớp lồi của một tập hợp,
. . . . Sau đây ta sẽ trình bày một số ứng dụng quan trọng của bài toán tìm bao
lồi.
9
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
1.2.1 Nhận dạng
Bài toán tìm bao lồi có ứng dụng rất quan trọng trong lĩnh vực nhận dạng.
Nhận dạng nhằm mục đích phân loại dữ liệu (là các mẫu) dựa vào thông tin
thống kê được khai thác từ các mẫu có sẵn. Các mẫu cần phân loại thường được
biểu diễn thành các nhóm của các dữ liệu đo đạc hay quan sát được.
Các ứng dụng phổ biến trong thực tế là nhận dạng tiếng nói tự động, phân
loại văn bản thành nhiều loại khác nhau (ví dụ những thư điện tử spam/non-
spam), nhận dạng tự động các mã bưu điện viết tay trên các bao thư, hay hệ
thống nhận dạng mặt người, nhận dạng biển số xe, . . . . Sau đây ta xét một ứng
dụng cụ thể của bài toán tìm bao lồi trong nhận dạng biển số xe. Nội dung và
hình vẽ được trích trong [14].
Hình 1.5
Quy trình của quá trình xử lý nhận diện biển số xe thường thông qua các
bước như hình 1.5 và bài toán tìm bao lồi được ứng dụng trong bước 4 của quá
trình nhận dạng. Trong bước này ta cô lập từng kí tự trong biển số xe được trích
ra ở bước 3. Tiếp theo sử dụng thuật toán tìm bao lồi tìm vùng tối thiểu chứa
mỗi kí tự đó để chuẩn bị tiến hành nhận dạng ở bước 5. Hình 1.6 biểu diễn các
10
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
bước của quá trình xử lý nhận diện biển số xe.
(a) Chụp ảnh từ camera (b) Tiền xử lý ảnh
(c) Trích vùng biển số xe (d) Tìm bao lồi cho mỗi kí tự
Hình 1.6 Các bước của quá trình nhận dạng
1.2.2 Tìm đường đi ngắn nhất
Bài toán đặt ra là tìm một đường đi ngắn nhất cho một robot đi từ điểm s
đến điểm t với các chướng ngại vật nằm giữa hai điểm đó. Giả sử để tránh các
chướng ngại vật thì robot không thể đi xuyên qua chúng được. Vì vậy nếu ta
tìm được bao lồi của tập P ∪ {s, t}, với P là tập các chướng ngại vật, thì đi theo
đường ngắn hơn trong hai đường biên trên và biên dưới của bao lồi sẽ không
gặp các chướng ngại vật và đường đi ấy là ngắn nhất (hình 1.7).
Hình 1.7 Đường đi ngắn nhất
11
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
1.2.3 Hệ thống thông tin địa lý (GIS)
Bài toán tìm bao lồi được ứng dụng trong các mô hình biểu diễn dữ liệu của
hệ thống thông tin địa lý GIS. GIS được thiết kế như một hệ thống chung để
quản lý dữ liệu không gian, nó có rất nhiều ứng dụng trong việc phát triển đô
thị và môi trường tự nhiên như là quy hoạch đô thị, quản lý nhân lực, nông
nghiệp, điều hành hệ thống công ích, lộ trình, nhân khẩu, bản đồ, giám sát vùng
biển, cứu hoả, bệnh tật, . . .. Các ứng dụng này của GIS được trình bày cụ thể
trong [2].
Trong các mô hình biểu diễn dữ liệu của GIS, chúng ta thường nhắc đến một
khái niệm là feature. Feature là một đối tượng trên bản đồ có hình dạng, vị trí
và các thuộc tính xác định cụ thể. Có ba mô hình dữ liệu trong GIS như mô
hình dữ liệu vector, mô hình dữ liệu raster và mô hình TIN. Bài toán tìm bao
lồi được áp dụng một cách gián tiếp trong các mô hình dữ liệu vector và mô
hình dữ liệu TIN. Dưới đây ta trình bày ứng dụng cụ thể của bài toán tìm bao
lồi trong mô hình dữ liệu vector. Nội dung và các hình vẽ trong phần này trích
từ [10].
Mô hình dữ liệu vector xem các sự vật và hiện tượng là tập các thực thể không
gian cơ sở và tổ hợp của chúng (hình 1.8a). Trong mô hình 2D thì các thực thể
cơ sở bao gồm: điểm (points), đường (lines) và vùng (polygons). Đối tượng điểm
biểu diễn các feature không có miền bao hay độ dài, nhiều khi nó biểu diễn các
feature có kích thước quá nhỏ so với tỷ lệ của bản đồ (hình 1.8b). Đối tượng
đường dùng để biểu diễn các feature có chiều dài xác định nhưng không có miền
bao hay những feature rất hẹp so với tỷ lệ bản đồ (hình 1.8c). Đối tượng vùng
được dùng để biểu diễn các feature có miền bao xác định như ruộng đất, ao, hồ
hay các đơn vị hành chính, . . . (hình 1.8d). Sau đó dựa vào các thuật toán phân
tích trên mô hình dữ liệu vector để đưa tập thực thể cơ sở thành một tập đối
tượng có thể đưa vào bản đồ. Một trong các thuật toán này là thuật toán tìm
bao lồi. Khi các thực thể cơ sở nhận được dưới dạng điểm thì ta dùng thuật
toán tìm bao lồi của một tập hợp điểm để đưa ra một một đối tượng là một đa
giác lồi nhỏ nhất chứa các điểm đó (hình 1.9a). Khi các thực thể cho dưới dạng
đường thì thuật toán tìm bao lồi của đường cong trong mặt phẳng, thuật toán
này được trình bày cụ thể ở [12], cũng cho ta một đối tượng mới là một đa giác
lồi nhỏ nhất chứa các thực thể đó (hình 1.9b). Cuối cùng nếu đối tượng được
cho dưới dạng vùng thì ta phải áp dụng thuật toán tìm bao lồi cho miền đa giác
đơn, thuật toán này đươc trình bày trong [9], để tạo ra một đối tượng mới là
12
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
một vùng nhỏ nhất bao kín đối tượng. Những đối tượng mới này có tính chất,
hình dạng và kích thước gần với các tập thực thể cơ sở nhất. Do vậy những đối
tượng này phù hợp để đưa vào bản đồ (hình 1.9).
(a) Bản đồ với mô hình dữ liệu vector. (b) Đối tượng điểm trên bản đồ.
(c) Đối tượng đường trên bản đồ. (d) Đối tượng vùng trên bản đồ.
Hình 1.8
(a) Thuật toán tìm bao lồi cho đối tượng điểm.
(b) Thuật toán tìm bao lồi cho đối tượng đường.
(c) Thuật toán tìm bao lồi cho đối tượng vùng.
Hình 1.9
13
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
1.2.4 Thống kê
Như ta biết, một bài toán trọng tâm trong thống kê là ước lượng đánh giá
thông số dân số (population parameter) từ một mẫu dữ liệu ngẫu nhiên được
rút ra. Tuy nhiên một số thông số đó lại cực kỳ nhạy cảm với giá trị ngoại lai
(outliers), đó là những điểm có số liệu cách xa một cách bất thường với trung
tâm của các quan sát. Các giá trị ngoại lai có thể có ảnh hưởng lớn đến việc tính
toán các ước lượng thông số trong phân tích hồi quy (regression analysis) hoặc
các số thống kê tóm tắt (brief statistics) chẳng hạn như trung bình và phương
sai mẫu mà kết quả là có thể lấy cả những giá trị không tiêu biểu. Do đó các
giá trị ngoại lai thường hay bị bỏ qua để không gây ra lỗi trong dự đoán. Một
ứng dụng của bao lồi có thể giải quyết được vấn đề này, đó là thuật toán tìm
các lớp lồi của một tập hợp bất kỳ. Với đầu vào là các điểm của một mẫu dữ
liệu ngẫu nhiên, ta có thể sử dụng thuật toán này cho vấn đề xóa lớp lồi đến
khi loại bỏ được các giá trị ngoại lai và giữ lại phần gần với trung tâm của các
quan sát hơn. Sau đây chúng ta đi trình bày thuật toán tìm các lớp lồi của một
tập hợp điểm. Nội dung của phần này tham khảo trong [3].
Giả sử ta có tập P , biên của conv(P ) được gọi là lớp lồi đầu tiên của P , kí
hiệu là cl(1). Nếu chúng ta xóa những điểm nằm trên cl(1) và tìm một bao lồi
mới của những điểm còn lại ta sẽ nhận được lớp lồi thứ hai của P , kí hiệu là
cl(2). Như vậy chúng ta sẽ tìm được lớp lồi thứ i+1 sau khi loại bỏ những điểm
của lớp lồi thứ i. Đây chính là nội dung của bài toán tìm các lớp lồi của một tập
hợp. Từ đó ta có định nghĩa độ sâu của một điểm trong một tập P như sau.
Định nghĩa 1.7. Độ sâu của một điểm p trong một tập P bằng số lớp lồi được
bỏ đi từ tập P trước khi p bị loại bỏ. Độ sâu của một tập P là độ sâu của điểm
sâu nhất của nó, tức là độ sâu của điểm cuối cùng bị loại bỏ. Độ sâu của tập P
kí hiệu là depth(P ) (hình 1.10).
Trong hình 1.10, pi có độ sâu là i với i = 0, 1, 2, 3, 4.
Phương pháp tốt nhất để tìm bao lồi của một tập P gồm n điểm có độ phức
tạp tính toán của thuật toán là O(n log n). Định nghĩa độ phức tạp tính toán
của thuật toán được trình bày cụ thể ở chương 2. Đầu tiên ta loại bỏ các đỉnh
của lớp lồi thứ nhất, sau đó tiếp tục tìm bao lồi của các tập điểm còn lại. Do
đó để tìm được độ sâu depth(P ) của P thì độ phức tạp tính toán của thuật toán
là O(n2 log n). Tuy nhiên áp dụng thuật toán gói quà tại mỗi lớp lồi cho ta một
thuật toán có độ phức tạp tính toán tốt hơn. Giả sử hi là số đỉnh của lớp lồi
thứ i. Tại lớp lồi thứ i thì thuật toán gói quà có độ phức tạp là O(nhi) và do đó
14
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
độ phức tạp của thuật toán tìm các lớp lồi là O(nh0 + nh1 + nh2 + ...+ nhk) với
k là độ sâu của tập điểm đầu vào. Vì h0 + h1 + h2 + ...+ hk = n nên độ phức tạp
của thuật toán này là O(n2).
1.2.5 Tìm đường kính của một tập hợp điểm
Bài toán tìm đường kính của một tập hợp điểm là một bài toán rất quan
trọng trong hình học tính toán và có ứng dụng trong những bài toán phân cụm
(clustering), đây là bài toán làm việc với các nhóm đối tượng tương tự nhau
được trình bày cụ thể ở [17], trang 170. Trước khi trình bày thuật toán của bài
toán tìm đường kính của một tập hợp điểm ta có định nghĩa sau.
Định nghĩa 1.8. Cho một tập S có n điểm, tìm trong tập S một cặp điểm sao
cho khoảng cách (khoảng cách Euclid) giữa chúng là lớn nhất. Nếu có nhiều cặp
điểm như vậy thì ta chọn một cặp trong số đó. Độ dài cạnh nối cặp điểm xa
nhất được gọi là đường kính của tập hợp S và cặp điểm xa nhất đó được gọi là
hai đỉnh của đường kính.
Như vậy bài toán tìm đường kính của một tập hợp là bài toán tìm cặp điểm
xa nhất của tập hợp đó. Phương pháp có thể áp dụng giải bài toán này là ta đi
tìm tất cả các khoảng cách giữa hai điểm bất kỳ của tập S và đường thẳng nối
một trong những cặp điểm có khoảng cách lớn nhất là đường kính của một tập
hợp điểm. Cách làm này có độ phức tạp tính toán là O(n2). Tuy nhiên dưới đây
ta sẽ trình bày một phương pháp là ứng dụng của bao lồi với độ phức tạp tính
toán là O(n log n).
Mệnh đề 1.1. Cho tập S gồm n điểm trong mặt phẳng. Hai đỉnh đường kính
của tập S là hai điểm cực biên của S, tức là hai điểm đó phải là hai đỉnh của
Hình 1.10 Độ sâu của một điểm và các lớp lồi của một tập hợp.
15
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 1.11
bao lồi conv(S).
Chứng minh. Bây giờ ta giả sử rằng một đỉnh của đường kính không phải là
điểm cực biên của S. Gọi (d, a) là cặp điểm xa nhất và giả sử rằng a không phải
là điểm cực biên của S. Khi đó a phải nằm trong tam giác dcb nào đó (tính cả
biên) với c, b ∈ S. Từ hình 1.11 ta thấy rõ ràng rằng độ dài đoạn thẳng da, kí
hiệu |da|, nhỏ hơn độ dài đoạn thẳng da′, kí hiệu |da′|. Và vì
|da′| < max{|db|, |dc|}
nên
|da| < max{|db|, |dc|}.
Điều này mâu thuẫn với giả sử da là đường kính của tập hợp S.
Định nghĩa 1.9. Cho tập S gồm n điểm, nếu đường thẳng l đi qua một hay
nhiều điểm của tập S sao cho tập hợp S nằm hoàn toàn trong một nửa mặt
phẳng xác định bởi đường thẳng l thì l được gọi là đường thẳng tựa trên tập S.
Định nghĩa 1.10. Nếu l1 và l2 là hai đường thẳng tựa trên tập S tương ứng đi
qua p1 và p2 (p1, p2 ∈ S) và l1 song song với l2 thì cặp điểm (p1, p2) được gọi là
cặp điểm đối cực của S.
Dưới đây ta đưa ra một định lí đã được trình bày và chứng minh ở [17]. Định
lý này đưa ra một ý tưởng quan trọng cho thuật toán tìm cặp điểm xa nhất của
một tập điểm trong mặt phẳng.
Định lý 1.1. ([17], định lý 4.18, trang 17) Cặp điểm xa nhất của một tập S là
một cặp đối cực của S mà có khoảng cách lớn nhất.
16
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Như vậy để tìm cặp điểm xa nhất thì ta phải tìm tất cả các cặp đối cực và
chọn một cặp có khoảng cách lớn nhất. Từ mệnh đề 1.1 và định lý 1.1 thì tất cả
các cặp điểm đối cực phải nằm trên bao lồi của tập S. Do đó đầu tiên ta phải
tìm bao lồi của của tập S, sau đó xác định các cặp đối cực từ các đỉnh của bao
lồi và tìm ra cặp có khoảng cách xa nhất. Thuật toán tìm cặp điểm xa nhất có
thể được trình bày như Algorthm 1.
(a) (b)
Hình 1.12
Ta có sự phân tích độ phức tạp tính toán của Algorithm 1 như sau. Bước
(1) có độ phức tạp là O(n log n). Xét đến bước (2), (a) có độ phức tạp là O(h),
(b) - (d) lặp lại như bước (a) cho mỗi cặp đối cực nên cũng có độ phức tạp là
O(h). Cuối cùng (e) cũng có độ phức tạp là O(h). Vì tập S có n điểm nên bao
lồi conv(S) có nhiều nhất n đỉnh, khi đó trong trường hợp xấu nhất thì bước (2)
có độ phức tạp là O(n). Do đó bài toán tìm đường kính của một tập hợp điểm
có độ phức tạp tính toán là O(n log n).
17
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Algorithm 1 Thuật toán tìm cặp điểm xa nhất của một tập hợp
1. Tìm bao lồi của tập S.
2. Cho H = {p0, p1, ..., ph} là các đỉnh của bao lồi conv(S).Giả sử bước 1 cho các đỉnh của bao lồi sắp xếp theo thứ tự ngược chiều kim đồng hồ. Ta tìmtất cả các cặp đối cực bằng cách quét tròn một đường thẳng quanh các đỉnh của bao lồi, cụ thểnhư sau.
(a) Cho l1 là đường thẳng tựa của S xác định bởi hai điểm p0 và p1 thuộc H. Với mọi điểmpj ∈ H, trong đó 2 ≤ j ≤ h ta xác định khoảng cách giữa các điểm pj và l1. Vì tất cả cácđiểm này là tập đỉnh của bao lồi conv(S) nên khi ta lần lượt xét tới các điểm theo thứ tựngược chiều kim đồng hồ thì các khoảng cách này sẽ tăng dần tới khi gặp một điểm màcó khoảng cách lớn nhất và sau đó khi xét tiếp đến các đỉnh tiếp theo thì các khoảng cáchnày lại giảm dần. Gọi pi là điểm có khoảng cách lớn nhất và l2 là đường thẳng đi qua pisao cho l2 song song với l1 (Nếu có hai điểm giống pi thì l2 đi qua cả hai điểm đó). Rõ rànglà l1 và l2 là các đường thẳng tựa trên cặp điểm đối cực của S (hình 1.12a).
(b) Gán θ′1 bằng góc nhọn tạo bởi l1 và p1p2.Gán θ′′1 bằng góc nhọn tạo bởi l2 và pipi+1.(Nếu có hai điểm pi thì ta chọn điểm pi ở bên trái để xác định θ′′1 ).Gán θ1 := min{θ′1, θ′′1}, d′1 := p0pi và d′′1 := p1pi.
If (d′1 ≥ d′′1) thend1 := d′1 và e1 := p0pi,
elsed1 := d′′1 và e1 := p1pi.
Sau đó đánh dấu các điểm p0, p1 và pi là những điểm đã được xét tới. (Nếu có hai điểmnhư pi thì ta tính khoảng cách từ p0 và p1 đến mỗi điểm pi đó, giá trị lớn nhất sẽ chọn làd1, cạnh tương ứng đặt là e1 và đánh dấu các điểm pi đó).
(c) If (θ′1 ≤ θ′′1 ) thenl1 := p1p2 và l2:= đường thẳng qua pi+1 và song song với l1,
elsel2 := pipi+1 và l1 := đường thẳng qua p1 và song song với l2.
Không mất tính tổng quát, giả sử l2 là đường thẳng chứa cạnh pipi+1 của bao lồi conve(S).θ′2, θ
′′2 , d
′2 và d′′2 được tính tương tự như ở bước trên (hình 1.12b). Gán d2 := max{d′2, d′′2}
và e2 là cạnh tương ứng với d2 và ta đánh dấu các đỉnh giống như bước trên.
(d) Tiếp tục gán l1, l2 và thực hiện giống bước (c) tới khi mọi đỉnh của bao lồi được đánh dấu.Khi đó ta có nhiều nhất h khoảng cách d1, d2, ..., dh và tương ứng có nhiều nhất h cạnhe1, e2, ..., eh.
(e) Đường kính của S là max{d1, d2, ..., dh} và cạnh tương ứng sẽ cho ta cặp điểm xa nhất củaS.
18
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Chương 2
Các thuật toán tìm bao lồi
Trong chương này ta xét các thuật toán tìm bao lồi trong không gian hai
chiều như thuật toán gói quà, thuật toán quét Graham, thuật toán Quickhull và
thật toán Chan. Trong rất nhiều tài liệu viết về bài toán tìm bao lồi đòi hỏi giả
thiết không có ba điểm bất kỳ nào thẳng hàng nhưng điều kiện này là không
cần thiết và làm mất tính tổng quát của bài toán. Một số thuật toán cần có điều
kiện không thẳng hàng nhưng không phải là ba điểm bất kỳ mà những bộ ba
điểm đặc biệt tùy thuộc vào thuật toán cụ thể nào đó. Những điều kiện này có
thể vượt qua bằng cách đơn giản và hiệu quả như chúng ta sẽ thấy chương này.
Trước khi trình bày các thuật toán này ta đưa ra một số khái niệm và thuật
toán cơ bản sau.
2.1 Một số khái niệm và thuật toán cơ bản
Đầu tiên ta trình bày định nghĩa sự định hướng của các điểm bất kỳ. Định
nghĩa này là cơ sở của những định nghĩa ta sẽ trình bày dưới đây.
Định nghĩa 2.1. Cho một bộ ba điểm đã sắp thứ tự (p, q, r) trong mặt phẳng,
ta nói rằng chúng có định hướng dương nếu theo thứ tự đã sắp xếp chúng tạo
thành hình ngược chiều kim đồng hồ, có định hướng âm nếu chúng tạo thành
hình thuận chiều kim đồng hồ và hướng không nếu chúng thẳng hàng (trong đó
bao gồm cả trường hợp có hai hay nhiều hơn các điểm trùng nhau) (hình 2.1).
Lưu ý rằng sự định hướng phụ thuộc vào thứ tự các điểm được đưa ra. Để xét
hướng của các điểm sắp thứ tự (p, q, r) với p = (px, py), q = (qx, qy) và r = (rx, ry)
thì ta có thể sử dụng công thức tính định thức cấp ba như dưới đây. Ta định
nghĩa
Orient(p, q, r) := det
(1 px py1 qx qy1 rx ry
).
19
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) Định hướng dương (b) Định hướng âm
(c) Hướng không
Hình 2.1 Sự định hướng
Khi đó bộ ba điểm sắp thứ tự (p, q, r) có định hướng dương nếu
Orient(p, q, r) > 0,
có định hướng âm nếu
Orient(p, q, r) < 0
và có hướng không nếu
Orient(p, q, r) = 0.
Định hướng của bộ ba điểm, tức là dấu của Orient(p, q, r), là không thay đổi nếu
những điểm này bị xoay đi một góc bất kì.
Nhận xét 2.1. Ta cũng có thể dùng định thức cấp hai để tính Orient(p, q, r)
như sau. Trước tiên ta chọn một trong ba điểm và tính hai vec tơ xuất phát từ
điểm đó. Giả sử ta chọn điểm p và tính hai véc tơ
−→pq = (qx − px, qy − py)
và−→pr = (rx − px, ry − py).
Khi đó ta có
Orient(p, q, r) = det
(qx − px qy − pyrx − px ry − py
).
20
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Nhận xét 2.2. Công thức tính Orient cũng được dùng để tính diện tích tam
giác. Chẳng hạn để tính diện tích Spqr của tam giác pqr ta có công thức
Spqr =1
2|Orient(p, q, r)|.
Sau đây ta định nghĩa một điểm bên trái hoặc bên phải một đoạn thẳng.
Định nghĩa của các điểm này được sử dụng trong các thuật toán tìm bao lồi như
thuật toán gói quà, thuật toán quét Graham, thuật toán Quickhull, . . . .
Định nghĩa 2.2. Trong không gian 2 chiều, cho ba điểm phân biệt p1, p2 và p3,
điểm p3 được gọi là bên trái đoạn thẳng p1p2 nếu Orient(p1, p2, p3) > 0. Điểm p3
được gọi là bên phải đoạn thẳng p1p2 nếu Orient(p1, p2, p3) < 0 và điểm p3 được
gọi là nằm trên đoạn thẳng p1p2 nếu Orient(p1, p2, p3) = 0.
Tiếp theo ta đưa ra định nghĩa các điểm tận cùng bên trái dưới, bên phải
dưới, bên trái trên, bên phải trên, bên dưới trái, bên dưới phải, bên trên trái và
bên trên phải. Những điểm này thuộc bao lồi và thường được dùng làm điểm
xuất phát cho các thuật toán tìm bao lồi sẽ được trình bày trong chương này.
Định nghĩa 2.3. Cho tập P = {p1, p2, . . . , pn}. Điểm tận cùng bên phải dưới là
điểm có tung độ bé nhất trong những điểm có hoành độ lớn nhất. Điểm tận cùng
bên phải trên là điểm có tung độ lớn nhất trong những điểm có hoành độ lớn
nhất. Điểm tận cùng bên trên phải là điểm có hoành độ lớn nhất trong những
điểm có tung độ lớn nhất. Điểm tận cùng bên trên trái là điểm có hoành độ nhỏ
nhất trong những điểm có tung độ lớn nhất. Điểm tận cùng bên trái trên là điểm
có tung độ lớn nhất trong những điểm có hoành độ nhỏ nhất. Điểm tận cùng
bên trái dưới là điểm có tung độ nhỏ nhất trong những điểm có hoành độ nhỏ
nhất. Điểm tận cùng bên dưới trái là điểm có hoành độ nhỏ nhất trong những
điểm có tung độ nhỏ nhất. Điểm tận cùng bên dưới phải là điểm có hoành độ
lớn nhất trong những điểm có tung độ nhỏ nhất (hình 2.2).
Trong hình 2.2, q1 là điểm tận cùng bên trái trên, q2 là điểm tận cùng bên
trên trái, q3 là điểm tận cùng bên trên phải, q4 là điểm tận cùng bên phải trên,
q5 là điểm tận cùng bên phải dưới, q6 là điểm tận cùng bên dưới phải, q7 là điểm
tận cùng bên dưới trái, q8 là điểm tận cùng bên trái dưới.
Một khái niệm mà ta cũng cần phải làm rõ đó là độ phức tạp tính toán của
thuật toán.
Định nghĩa 2.4. Độ phức tạp tính toán của thuật toán được đo trên số lượng
các phép toán cơ bản như phép cộng, phép trừ, phép nhân, phép chia và phép
21
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 2.2
so sánh mà nó thực hiện. Với mỗi thuật toán cụ thể số lượng này phụ thuộc vào
cỡ (size) của dữ liệu nhập. Như thế ta có thể xem độ phức tạp tính toán của
một thuật toán là một hàm phụ thuộc vào cỡ của dữ liệu nhập. Nếu cỡ mã hóa
của dữ liệu nhập là n thì độ phức tạp có thể được xem là một hàm theo n.
2.2 Thuật toán gói quà
Một trong những thuật toán đơn giản nhất trong các thuật toán hình học
phẳng là thuật toán gói quà. Thuật toán này phát hiện độc lập bởi Chand và
Kapur vào năm 1970 và Jarvis vào năm 1973 [11]. Cho tập P hữu hạn n điểm,
thuật toán bắt đầu với i = 1, ta xác định một điểm thuộc bao lồi, chẳng hạn ta
chọn điểm v1 là điểm tận cùng bên phải dưới (hình 2.3b) và gán H := v1. Sau
đó giả sử t là chỉ số cao nhất trong H mà ta tìm được tới nay thì nếu tìm được
điểm vi sao cho tất các điểm còn lại của P đều nằm bên trái đoạn thẳng vtvi
thì ta gán H := H ∪ {vi}. Nếu tìm được điểm vj sao cho tất cả các điểm còn lại
của P đều nằm bên trái hoặc nằm trên vtvj thì trong các điểm nằm trên vtvj ta
tìm điểm xa vt nhất, giả sử là vi và gán H := H ∪ {vi}. Ta có thể lặp lại điều
này để tìm ra các điểm tiếp theo (hình 2.3e), đến khi nào tìm được điểm trùng
với v1 thì dừng lại (hình 2.3f). Như vậy để tìm mỗi điểm mới của bao lồi ta mất
thời gian là O(n). Do vậy thuật toán này có độ phức tạp tính toán là O(nh),
trong đó n là số điểm trong tập hợp ban đầu cần tìm bao lồi và h là số đỉnh của
bao lồi. Trong trường hợp xấu nhất, độ phức tạp của thuật toán là O(n2) khi
h = n. Thuật toán gói quà có thể được trình bày như thuật toán 2, thuật toán
này được tham khảo từ [13]. Tuy nhiên thuật toán trong [13] giả thiết không có
ba điểm nào thẳng hàng còn ở đây ta sẽ xét trong trường hợp tổng quát.
22
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) (b) (c)
(d) (e) (f)
Hình 2.3 Thuật toán gói quà
Algorithm 2 Thuật toán gói quàInput: Tập P gồm n điểm p1, p2, ..., pn, giả sử n ≥ 2.Output: Tập H gồm các điểm là đỉnh của conv(P ).
1. Gán v là điểm bên phải dưới.
2. Gán i := 1, H := ∅.Repeat
vi := v, H := H ∪ vi, p := p1.For j = 2 to n do
If (p = vi ) or (pj nằm bên phải vip) or ((pj nằm trên vip) and (vipj > vip)) thenp := pj .
i := i+ 1, v := p.
Until p = v1.
2.3 Thuật toán quét Graham
Thuật toán quét Graham là một thuật toán phức tạp hơn thuật toán gói quà
được phát hiện bởi Ronald Graham vào năm 1972 [7]. Giả sử cho tập hợp P bất
kỳ, đầu tiên thuật toán sắp xếp lại các điểm của tập hợp này theo một thứ tự
23
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
xác định. Việc sắp xếp hoàn thành có độ phức tạp tính toán là O(n log n) và cho
ta một đa giác khép kín. Đa giác này có thể không lồi nhưng ta có thể dựa vào
nó để tìm tập H các đỉnh của bao lồi conv(P ). Sau khi các điểm của tập hợp P
được sắp xếp thì việc tìm bao lồi của nó có độ phức tạp tính toán là O(n). Vì
vậy thuật toán quét Graham có độ phức tạp tính toán là O(n log n). Trước tiên
ta trình bày việc so sánh hai góc trong mặt phẳng. Việc so sánh này cần cho
việc sắp xếp các điểm trong thuật toán quét Graham ở mục sau.
2.3.1 So sánh hai góc trong mặt phẳng
Sự so sánh hai góc trong mặt phẳng mà ta nói đến ở đây là sự so sánh hai
góc có hướng. Sau đây ta trình bày định nghĩa và nhận xét về góc có hướng.
Góc có hướng được định nghĩa dựa vào việc quay một tia hay một đoạn thẳng
quanh một điểm trong mặt phẳng. Để khảo sát việc quay này ta cần chọn một
chiều quay, gọi là chiều dương, ngược chiều quay của kim đồng hồ. Khi đó ta có
thể định nghĩa góc có hướng như dưới đây.
Định nghĩa 2.5. Cho hai đoạn thẳng IA và IB. Nếu IC quay theo chiều dương
xuất phát từ IA đến trùng với IB thì ta nói đoạn thẳng IC quay một góc AIB,
ta gọi góc AIB là góc có hướng, kí hiệu là AIB với cạnh đầu là IA và cạnh cuối
là IB (hình 2.4).
Hình 2.4 Góc có hướng AIB
Trong thuật toán quét Graham ta chỉ cần so sánh hai góc có độ lớn nằm trong
nửa đoạn (0, π] và có tính chất như sau. Chẳng hạn cho ba điểm p1, p2 và p3 đôi
một khác nhau thỏa mãn tung độ của p1 nhỏ hơn hoặc bằng tung độ của p2 và
tung độ của p3, nếu xảy ra dấu bằng thì hoành độ của p1 phải lớn hơn hoành
độ của điểm có tung độ bằng tung độ của p1. Ta phải so sánh góc tạo bởi p1p2
với trục hoành và góc tạo bởi p1p3 với trục hoành (hình 2.5).
24
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) xp1p3 > xp1p2 (b) xp1p3 = xp1p2
Hình 2.5 So sánh góc
Nhận xét 2.3. Nếu điểm p3 nằm bên trái đoạn thẳng nối hai điểm p1 và p2,
tức là Orient(p1, p2, p3) > 0, thì
xp1p3 > xp1p2,
nếu p1, p2, p3 thẳng hàng, tức là Orient(p1, p2, p3) = 0, thì
xp1p3 = xp1p2.
2.3.2 Sắp xếp
Việc sắp xếp các điểm bắt đầu bằng việc tìm điểm tận cùng bên dưới phải,
gọi điểm này là p1. Sau khi tìm được p1 ta sắp xếp các điểm còn lại theo thứ
tự tăng dần của các góc tạo bởi chiều dương của trục hoành và đoạn thẳng nối
p1 với mỗi điểm đó. Rõ ràng độ lớn của các góc này đều nằm trong nửa đoạn
(o, π] và cách so sánh chúng ta đã nêu ở nhận xét 2.3. Tiếp theo ta xét trường
hợp có hai điểm pi, pj khác nhau nào đó trong P tạo với p1 ba điểm thẳng hàng,
tức là Orient(p1, pi, pj) = 0 hay pip1x = pjp1x với p1x song song và cùng chiều
dương với trục hoành. Ta ký hiệu góc pip1x là góc(pi). Trong trường hợp này
nếu |p1pi| < |p1pj | thì rõ ràng pi không thuộc bao lồi conv(P ) nên ta sẽ xóa điểm
này đi. Ở hình 2.6 những điểm màu trắng là những điểm bị xóa còn những điểm
màu đen không bị xóa. Các thuật toán 3, 4, 5 và 6 ở dưới đây được chỉnh sửa
từ những thuật toán trong [15].
25
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 2.6
Ta dùng thuật toán Quicksort để sắp xếp các điểm trong tập P . Trước tiên
ta trình bày hàm so sánh (compare), là một hàm con sẽ được gọi trong thuật
toán Quicksort, trình bày ở thuật toán 3. Thuật toán này dùng để so sánh hai
góc(pi) và góc(pj) với hai điểm pi, pj bất kỳ và đánh dấu số 2 tại những điểm cần
xóa trong trường hợp thẳng hàng. Nếu góc(pj) > góc(pi) hàm compare sẽ trả về
giá trị -1, góc(pj) < góc(pi) trả về giá trị 1 và góc(pj) = góc(pi) trả về giá trị 0.
Algorithm 3 CompareInput: Điểm p1 là điểm tận cùng bên dưới phải, hai điểm pi và pj bất kỳ với giả thiết pi 6= pj .Output: Thứ tự của hai điểm pi và pj và trong trường hợp góc(pi) = góc(pj) thì đánh dấu điểmthích hợp để xóa.Compare(pi, pj)
1. Gán a := Orient(p1, pi, pj).
2. If ( a > 0) then return -1;else if ( a < 0) then return 1;else if |p1pi| < |p1pj | then đánh dấu điểm pi là 2, return 0;
else đánh dấu điểm pj là 2, return 0.
Trong hàm quicksort ta gọi một hàm nữa đó là hàm partition, hàm này có
nhiệm vụ phân hoạch một tập hợp điểm bất kỳ thành hai phần. Giả sử đầu vào
cho tập A là một dãy các điểm bất kỳ ap, ap+1, ..., ar và x là một điểm được chọn
ngẫu nhiên trong A. Để đơn giản ở thuật toán 4 ta chọn x bằng ar là phần tử
cuối cùng của dãy. Ta sẽ dùng điểm này để phân hoạch tập A. Đầu ra của thuật
toán ta nhận được tập B có các phần tử bp, bp+1, ..., bi, bi+1, ..., br vẫn là các phần
tử của tập A nhưng có thứ tự sắp xếp khác. Ở bước cuối cùng của thuật toán
ta có lệnh return i+1 để hàm này trả về vị trí mới của điểm ar, lúc này điểm ar
không còn nằm ở vị trí cuối dãy mà được chuyển lên vị trí i + 1, tức là sau khi
phân hoạch thì điểm ar của tập A bây giờ là điểm bi+1 của tập B. Tập B được
26
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
sắp xếp như sau: Những điểm bp, bp+1, ..., bi có góc nhỏ hơn góc(bi+1) và những
điểm bi+1, bi+2, ..., br có góc lớn hơn hoặc bằng góc(bi+1). Thuật toán 4 biểu diễn
hàm patition này.
Algorithm 4 PatitionInput: Tập A là một tập điểm bất kỳ ap, ap+1, ..., ar.Output: Tập B là một phân hoạch của tập A (như đã trình bày ở trên).Partition (A, p, r)
1. Gán i := p− 1.
2. For (j = p) to r − 1 do
if Compare(aj , ar) = −1 then
Gán i := i+ 1 và đổi vị trí hai điểm aj , ai.
3. Đổi chỗ hai điểm ai+1 và ar.
4. Return i+ 1.
Thuật toán 5 trình bày việc sắp xếp các điểm {ps, ps+1, ..., pt} của tập P =
{p1, p2, ..., ps, ps+1, ..., pt, ..., pn} bất kỳ được thực hiện bằng cách gọi hàm patition
đã trình bày ở trên, hàm này trả về giá trị q, sau đó giá trị q được dùng để gọi
đệ qui trong hàm Quicksort.
Algorithm 5 Thuật toán Quicksort(P, s, t)
Input: Cho P là tập bất kỳ p1, p2, ..., ps, ps+1, ..., pt, ..., pn có nhiều hơn t− s+ 1 điểm.Output: Tập các điểm của P nhưng các điểm từ vị trí thứ s đến vị trí thứ t đã được sắp xếp lại theothứ tự tăng dần của các góc tạo bởi chiều dương trục hoành và đoạn thẳng nối p1 với mỗi điểm đó,p1 là điểm tận cùng bên dưới phải.
Quicksort (P, s, t)
If (s < t) then
1. Gán q := Partition (P, s, t),
2. Gọi Quicksort (P, s, q − 1) và Quicksort (P, q + 1, t),
else
Return.
Tiếp theo ta trình bày thuật toán 6, thuật toán này dùng để sắp xếp và xóa
các điểm đã được đánh dấu của một tập P gồm n điểm bất kỳ. Thuật toán tiến
hành theo hai bước như dưới đây.
Bước 1 : Ta gọi hàm Quicksort(P, 1, n) để sắp xếp n điểm của tập P theo thứ tự
27
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
xác định như đã trình bày ở phần đầu của mục này. Hình 2.7a biểu diễn các
điểm đã được sắp xếp theo thứ tự xác định và những điểm cần xóa đã được
đánh dấu bởi số 2.
Bước 2 : Ta bỏ đi các điểm đã được đánh dấu của tập P bằng cách không gán
các điểm này vào tập Q. Như vậy tập Q là tập P sau khi được sắp xếp và không
còn chứa các điểm bị đánh dấu. Hình 2.7b biểu diễn các điểm của tập P sau khi
đã xóa điểm.
(a) (b)
Hình 2.7
Algorithm 6 Thuật toán QuicksortInput: Tập P gồm n điểm bất kỳ p1, p2, ..., pn.Output: Tập Q là tập P sau khi được sắp xếp và không còn chứa các điểm bị đánh dấu.
QUICKSORT(P )
1. Quicksort (P, 1, n).
2. Gán Q := ∅ và j := 1.
3. For i = 1 to n do
If nếu điểm pi đánh dấu 6= 2 then
Gán qj := pi, j := j + 1.
4. Return Q = {q1, q2, ..., qm}.
28
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
2.3.3 Thuật toán quét Graham
Sau đây ta sẽ trình bày cụ thể thuật toán quét Graham để tìm bao lồi của
tập hợp P bất kỳ, thuật toán này được tham khảo và chỉnh sửa từ [15].
Algorithm 7 Thuật toán quét GrahamInput: Tập P gồm n điểm, giả sử n ≥ 2, H := ∅.Output: Tập H gồm các điểm là đỉnh của conv(P ).
1. Tìm p1 là điểm tận cùng bên dưới phải của tập P và gọi Q= QUICKSORT (P ).Sau khi sắp xếp tập P ta được tập Q = {q1, q2, ..., qm} với m ≤ n.
2. Cho i = 2, gán H := {q1, q2}.
3. While i ≤ m do
If qi nằm bên trái đoạn thẳng qt−1qt, với t là chỉ số cao nhất trong H then
Gán H := H ∪ {qi} và gán i := i+ 1,
else
Gán H := H\{qt}.
Ta minh họa thuật toán cho ví dụ với các điểm của tập P như trong hình
2.8a, trong đó các điểm đã được sắp xếp thứ tự. Đầu tiên ta gán
H := {p1, p2},
khi xét tới điểm p3 ta thấy p3 nằm bên trái p1p2 nên đẩy p3 vào H nên gán
H := H ∪ {p3} = {p1, p2, p3}.
Tiếp theo ta xét tới điểm p4 ta nhận thấy p4 nằm bên phải p2p3 nên loại p3
khỏi H, do đó ta gán
H := H\{p3} = {p1, p2}.
Sau đó ta kiểm tra lại xem p4 có thuộc tập H mới này không thì ta thấy p4 nằm
bên trái p1p2 nên ta gán
H := H ∪ {p4} = {p1, p2, p4}.
Có thể có nhiều hơn một điểm bị loại khi xét một điểm mới, chẳng hạn khi xét
tới p7, lúc này tập H có dạng
H = {p1, p2, p4, p5, p6},
ta thấy p7 nằm bên phải p5p6 nên loại p6 ra khỏi H, do đó ta gán
H := H\{p6} = {p1, p2, p4, p5}.
29
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) (b) (c) (d)
(e) (f) (g) (h)
(i) (j) (k) (l)
Hình 2.8 Thuật toán Graham’s scan
Với tập H mới này ta thấy p7 lại nằm bên phải p4p5 nên tiếp tục loại p5 ra khỏi
H, khi đó ta gán
H := H\{p5} = {p1, p2, p4}.
Sau khi loại p5 thì p7 nằm bên trái p2p4 do đó ta gán
H := H ∪ {p7} = {p1, p2, p4, p7}.
Làm tương tự như vậy cho đến khi xét đến điểm cuối cùng của P ta được tập
H là tập đỉnh của conv(P ). Hình 2.8 biểu diễn các bước của thuật toán quét
Graham.
2.4 Thuật toán Quickhull
Thuật toán Quickhull được phát hiện độc lập vào năm 1997 bởi W. Eddy [6]
và vào năm 1978 bởi A.Bykat [4]. Cũng giống như thuật toán Quick Sort, thời
gian tính toán của thuật toán Quickhull trong nhiều trường hợp là O(n log n)
30
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
nhưng trong trường hợp xấu nhất (worst case) là O(nh) hay O(n2). Ta sẽ trình
bày vấn đề này rõ hơn ở dưới đây sau khi trình bày xong thuật toán.
Cho tập P hữu hạn gồm n điểm. Thuật toán bắt đầu với việc tìm hai điểm
thuộc vào bao lồi, chẳng hạn ta chọn điểm p tận cùng bên trái dưới và điểm q
tận cùng bên phải trên, sau đó gán H := {p, q}. Nối hai điểm này ta được một
đoạn thẳng chia tập gồm (n − 2) điểm còn lại của P thành hai tập hợp điểm.
Gọi P1 là tập hợp các điểm nằm bên trái đoạn thẳng pq hướng từ p đến q, P2 là
tập hợp các điểm nằm bên trái đoạn thẳng qp hướng từ q đến p. Tiếp theo ta đi
tìm bao lồi cho tập P1∪{p, q} và tập P2∪{p, q}. Trong tập Pk ∪{p, q} với k = 1, 2,
ta tìm điểm r sao r là điểm xa đoạn thẳng pq nhất hay diện tích tam giác pqr
lớn nhất và gán H := H ∪ {r}. Ba điểm p, q và r chia mỗi tập Pk thành 3 phần
gọi là S0, S1 và S2 (hình 2.9c). Trong đó S0 là các điểm nằm phía trong tam giác
prq, S1 là tập các điểm nằm phía bên trái đoạn thẳng pr hướng từ p đến r và
S2 là tập điểm nằm phía bên trái đoạn thẳng rq hướng từ r đến q. Sau đó thay
đoạn thẳng pq bởi pr và rq và tiếp tục thuật toán. Thuật toán Quickhull có thể
được trình bày như thuật toán 8. Hình 2.9 biểu diễn các bước của thuật toán
Quickhull.
Algorithm 8 Thuật toán QuickhullInput: Tập P gồm n điểm, giả sử n ≥ 2, H := ∅.Output: Tập H gồm các điểm là đỉnh của conv(P ).
1. Tìm điểm p tận cùng bên trái và điểm q tận cùng bên phải, gán H := H ∪ {p}.Hai điểm p và q chia tập gồm n− 2 điểm còn lại của P thành hai tập hợp điểm. Gọi P1 là tậphợp các điểm nằm bên trái đoạn thẳng pq hướng từ p đến q, P2 là tập hợp các điểm nằm bêntrái đoạn thẳng qp hướng từ q đến p.
2. Gọi Findhull (P1, p, q).
3. Gán H := H ∪ {q}.
4. Gọi Findhull (P2, q, p).
Findhull(Pk, p, q)
1. Nếu Pk = ∅ thì quay lại.
2. Nếu Pk 6= ∅ thì tìm điểm r có khoảng cách tới pq là lớn nhất.Nối ba điểm p, q và r chia tập Pk thành ba tập S0, S1 và S2. Trong đó S0 là các điểm nằm trongtam giác pqr, S1 là các điểm nằm bên trái pr hướng từ p tới r và S2 là tập các điểm nằm bêntrái rq hướng từ r tới q.
3. Gọi Findhull(S1, p, r).
4. Gán H := H ∪ {r}.
5. Gọi Findhull(S2, r, q).
31
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) (b) (c)
(d) (e) (f)
Hình 2.9 Thuật toán Quickhull
Nhận xét 2.4. Để tìm điểm r có khoảng cách tới pq là xa nhất ta làm như sau:
Giả sử tọa độ các điểm là r(rx, ry), p(px, py) và q(qx, qy) thì khoảng cách từ r tới
pq là
d =|(px − qx)(ry − py) + (py − qy)(rx − px)|√
(px − qx)2 + (py − qy)2.
Ta thấy rằng tử số của công thức trên là công thức tính hai lần diện tích của
tam giác pqr và cũng là công thức tính Orient(p, q, r) còn mẫu số là độ lớn đoạn
thẳng pq. Tức là
d =|Orient(p, q, r)|√
(px − qx)2 + (py − qy)2.
Độ lớn của pq không phụ thuộc vào tọa độ của điểm r. Vì vậy khoảng cách từ
r tới pq lớn nhất nếu diện tích tam giác pqr là lớn nhất hay |Orient(p, q, r)| lớnnhất.
Tiếp theo ta phân tích độ phức tạp tính toán của thuật toán Quickhull [15].
Ta thấy rằng, để tìm hai điểm p, q và chia tập P thành hai phần P1 và P2 thì ta
cần thời gian là O(n). Trong hàm đệ quy ta mất tối đa n bước để tìm điểm r
nhưng giá trị của hàm đệ qui thì phụ thuộc vào cỡ và sự phân bố các điểm của
các tập S1 và S2. Giả sử S1 có a phần tử và S2 có b phần tử với a+b ≤ n−1 = O(n).
Tổng số phần tử của của S1 và S2 tối đa là n− 1 vì điểm r không nằm trong S1
32
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
hoặc S2. Nếu gọi độ phức tạp tính toán của thuật toán này là T (n) thì ta có
T (n) = T (a) + T (b) +O(n).
Cụ thể, xét trường hợp tốt nhất có thể, trong trường hợp này các điểm của tập
P phân phối rất đồng đều trong mỗi phần được chia ra. Tức là a = b = n/2,
trong phân tích này ta bỏ qua một sự khác biệt nhỏ là tổng a+ b = n− 1, do đó
ta có
T (n) = 2T (n/2) +O(n).
Đây là một quan hệ đệ quy quen thuộc và nó có kết quả là
T (n) = O(n log n).
Như vậy trường hợp tốt thì nhất độ phức tạp tính toán của thuật toán là
O(n log n). Ta xét trong trường hợp khi các điểm phân phối không đồng đều
trong tập hợp đầu vào, tức là khi ta chia tập hợp thành hai phần thì số lượng
các điểm ở mỗi phần đó không lệch nhau. Và trường hợp xấu nhất là có một phần
chứa hầu hết các điểm còn phần kia thì không chứa điểm nào. Trong trường hợp
này ta có
T (n) = T (n) + T (0) +O(n) = T (n) +O(n).
Tương tự ta có
T (n− 1) = T (n− 2) +O(n),
T (n− 2) = T (n− 3) +O(n),
...
T (1) = T (0) +O(n).
Cộng từng vế ta được
T (n) = O(n2).
Vậy trong trường hợp xấu nhất thì độ phức tạp tính toán của thuật toán là
O(n2). Tiếp theo ta phân tích độ phức tạp trung bình của thuật toán Quickhull.
Gọi Mn là thời gian trung bình của thuật toán Quickhull tìm bao lồi của một
tập gồm n điểm bất kỳ. Để tính giá trị trung bình này ta sử dụng việc tính kỳ
vọng có điều kiện (conditional expectation), xem trong [16]. Trong hàm đệ quy
của thuật toán Quickhull tìm bao lồi của tập P có n điểm ta mất tối đa n bước
đi so sánh để tìm điểm r. Vì vậy Mn là giá trị trung bình của n bước so sánh.
Áp dụng công thức tính kỳ vọng có điều kiện ta có
33
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Mn = E(X) =n∑
j=1
E(X/Y = r).p(Y = r).
Trong đó, E(X) là kỳ vọng của số các phép so sánh, E(X/Y = r) là kỳ vọng của
phép so sánh với điều kiện điểm r được chọn và P là xác suất điểm r được chọn.
Để tìm ra điểm r ban đầu thì cần có n− 1 phép so sánh và xác suất để r được
chọn trong tập n điểm là 1n . Nếu pq chia tập P ra thành hai phần, giả sử một
phần có j − 1 điểm thì phần còn lại có n− j điểm, tổng hai phần là n− 1 điểm
vì r không thuộc vào phần nào trong hai phần được chia. Do đó ta có
Mn =n∑
j=1
((n− 1) +Mj−1 +Mn−j)1n
= n− 1 + 2n
n−1∑k=1
Mk (vì M0 = 0 ).
Vậy
nMn = n(n− 1) + 2
n−1∑k=1
Mk.
Thay giá trị của n bởi n− 1 ta có
(n− 1)Mn−1 = (n− 1)(n− 2) + 2
n−2∑k=1
Mk.
Trừ từng vế hai biểu thức ta có
nMn − (n− 1)Mn−1 = 2(n− 1) + 2Mn−1
hay
nMn = (n+ 1)Mn−1 + 2(n− 1).
Do đóMn
n+ 1=
2(n− 1)
n(n+ 1)+Mn−1n
=2(n− 1)
n(n+ 1)+
2(n− 2)
(n− 1)n+Mn−2n− 1
= . . .
= 2n−2∑k=1
n− k(n+ 1− k)(n+ 2− k)
(vì M1 = 0).
Suy ra
34
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Mn = 2(n+ 1)
n−2∑k=0
n− k − 1
(n− k)(n− k + 1)
= 2(n+ 1)n−1∑i=1
i
(i+ 1)(i+ 2).
Sử dụng đồng nhất thức
i
(i+ 1)(i+ 2)=
2
i+ 2− 1
i+ 1
ta có xấp xỉ của Mn như sau
Mn = 2(n+ 1)
[n−1∑i=1
2
i+ 2−
n−1∑i=1
1
i+ 1
]≈ 2(n+ 1)
[n+1∫2
2
xdx−
n∫1
1
xdx
]= 2(n+ 1) [2 ln(n+ 1)− ln(n) + ln 1− 2 ln 2]
= 2(n+ 1)[ln(n+ 1)− ln n+1
n − 2 ln 2]
≈ 2(n+ 1) ln(n+ 1)
≈ 1, 386(n+ 1) log(n+ 1),
trong đó log là logarit cơ số 2. Như vậy Mn ≈ 1, 386(n+1) log(n+1) hay thời gian
trung bình của Quickhull cũng là O(n log n), nó gần với trường hợp tốt nhất hơn
là xấu nhất O(n2).
2.5 Thuật toán Chan
Thuật toán Chan được phát hiện bởi Timothy Chan vào năm 1993 [5], thuật
toán này có độ phức tạp tính toán là O(n log h). Thuật toán Chan là sự kết hợp
khéo léo hai thuật toán quét Graham và thuật toán gói quà để tạo thành một
thuật toán có tốc độ nhanh hơn.
Cho tập P hữu hạn n điểm. Gọi h là số đỉnh của bao lồi conv(P ). Giả sử ta
biết trước giá trị của h, giả thuyết này là không thực tế nhưng ta sẽ loại bỏ
nó sau, khi đó thuật toán Chan chia thành hai bước như dưới đây với tham số
m = h.
Bước 1 : Ta chia tập hợp P thành các nhóm con P1, P2, ..., Pr rời nhau có nhiều
35
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
nhất m điểm, khi đó số các nhóm con là r = b nmc+ 1. Sau đó ta tìm bao lồi của
mỗi nhóm con đó bằng cách sử dụng thuật toán quét Graham (hình 2.10b). Gọi
tập đỉnh của mỗi nhóm này là Vi với i = 1, 2, ..., r. Thời gian để tìm bao lồi của
mỗi nhóm là O(m logm). Do đó tổng thời gian tìm bao lồi của r nhóm là
O(r.m logm) = O(n logm).
(a) (b) (c)
(d) (e) (f)
Hình 2.10 Thuật toán Chan
Bước 2 : Gọi M là tập các đỉnh của các bao lồi vừa tìm được ở bước 1. Ta sẽ
dùng thuật toán gói quà để tìm bao lồi của tập hợp này. Bao lồi của tập hợp này
cũng chính là bao lồi của tập hợp P ban đầu. Cụ thể ta tiến hành như sau: Xác
định điểm tận cùng phía dưới của tập M gọi điểm này là điểm v1 (hình 2.10c).
Tại bước đầu tiên của thuật toán gói quà ta tìm các điểm qi ∈ Vi(i = 1, 2, ..., r)
sao cho các đỉnh còn lại của mỗi tập Vi đều nằm bên trái đoạn thẳng v1qi (hình
2.10c). Trong các điểm qi vừa tìm được ta tìm một điểm, gọi điểm đó là v2, sao
cho các điểm còn lại nằm bên trái v1v2. Bước tiếp theo thay v1 bởi v2 và tiếp tục
tìm các điểm qi ∈ Vi(i = 1, 2, ..., r) sao cho các đỉnh còn lại của mỗi tập Vi đều
nằm bên trái đoạn thẳng v2qi. Trong các điểm qi vừa tìm được ta lại tìm một
điểm, gọi điểm đó là v3, sao cho các điểm còn lại nằm bên trái v2v3. Tiếp tục
thuật toán đến khi tìm được điểm trùng với v1 thì dừng lại (hình 2.10d, 2.10e,
2.10f). Vì mỗi tập đỉnh Vi của conv(Pi) có nhiều nhất m điểm nên để tìm điểm
qi của mỗi tập Vi ta mất thời gian nhiều nhất là O(logm) bằng cách tìm kiếm
36
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
nhị phân, có r tập Vi nên tổng thời gian của mỗi bước "gói quà" là O(r logm).
Ta giả sử conv(P ) có h đỉnh nên ta có h bước "gói quà" ở bước 2. Do đó tổng
thời gian chạy của bước hai là
h.O(r logm) = O(h. nm logm).
Do đó tổng thời gian của cả hai bước là
O(n logm) +O(h.n
mlogm) = O((n+ h.
n
m) logm).
Rõ ràng, nếu m = h thì thời gian chạy là O(n log h). Vấn đề ở đây là ta không
biết trước giá trị của h vì vậy cũng không biết giá trị của m như thế nào trong
thuật toán. Vấn đề này ta sẽ giải quyết sau. Thuật toán 9 chạy với một giá trị
m nào đó. Nếu m < h thì thật toán trả về "m quá nhỏ" và thuật toán dừng lại
nếu m ≥ h, khi này ta tìm được bao lồi của tập P . Các thuật toán 9 và 10 được
tham khảo từ [13].
Algorithm 9 PartialHull(P;m)
1. Cho r = b nmc+1, chia P thành r tập con rời nhau P1, P2, ..., Pr, mỗi tập có nhiều nhất m điểm.
2. For i = 1 to r doTìm các tập đỉnh Vi của conv(Pi) sử dụng thuật toán quét Graham và lưu các đỉnh vào mộtmảng có thứ tự.
3. Tìm v1 là điểm tận cùng phía dưới phải của P .
4. For k = 1 to m
(a) For i = 1 to rTìm điểm qi ∈ Vi sao cho các điểm còn lại của mỗi tập Vi đều nằm bên trái đoạn vkqi,
(b) Đặt vk+1 là điểm thuộc vào tập q1, q2, ..., qr} sao cho tất cả các điểm còn lại trong tập{q1, q2, ..., qr} đều nằm bên trái đoạn thẳng vkvk+1,
(c) Nếu vk+1 = v1 thì return H = v1, v2, ..., vk.
5. Return "m quá nhỏ".
Như vậy vấn đề đặt ra là phải tìm được giá trị của m. Ban đầu có thể thiết
lập m là một hằng số và tăng giá trị của m cho đến khi m > h. Nếu tăng giá trị m
quá chậm thì khoảng thời gian bị bỏ phí khi m < h có thể quá lớn. Trong khi đó
nếu tăng m quá nhanh, ta có thể làm m lớn hơn h rất nhiều và do đó cũng làm
tăng thời gian thực hiện. Để giữ cho tổng số dự đoán đủ thấp, người đã thiết
lập một tham số t = 0 và bình phương giá trị của m sau mỗi lần lặp, đảm bảo
giá trị m không bao giờ vượt quá n, tức là m = min{22t , n}. Sau mỗi dự đoán là
sai chúng ta tăng t bởi 1 và tính toán lại m chẳng hạn m = 4, 16, 256, 65536, ... Ta
37
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
biết rằng thuật toán sẽ dừng lại trước khi 22t ≥ h tức là t tối đa bằng O(log log h).
Như vậy m tăng rất nhanh và đảm bảo tổng thời gian chạy của thuật toán là
O(log log h)∑t=0
O(n log(22t
)) = O(n)
O(log log h)∑t=0
O(2t) ≤ O(n.21+O(log log h))
= O(n log h).
Để tìm tập đỉnh H của bao lồi conv(P ) ta có thể thực hiện như thuật toán 10.
Algorithm 10 Conv(P )Cho t = 1.
1. Tìm m = min{22t , n}.
2. Gọi PartialHull(P ;m).
(a) Nếu nhận được convex hull thì dừng,
(b) Nếu nhận được kết quả "m quá nhỏ" thì gán t := t+ 1 và quay lại bước (1).
38
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Chương 3
Cải tiến các thuật toán
Trong chương này ta sẽ đưa ra một thuật toán có thể giúp cho việc tìm bao
lồi của một tập hợp điểm chạy nhanh hơn. Thuật toán này dựa vào tính chất
của những điểm đặc biệt nằm trên bao lồi để nhận biết và xóa bớt những điểm
không thuộc bao lồi. Việc này sẽ làm giảm đáng kể khối lượng tính toán của
các thuật toán tìm bao lồi của một tập điểm. Có thể đã có người làm việc với
ý tưởng này rồi nhưng đến thời điểm này chúng tôi vẫn chưa tìm thấy tài liệu
nào. Cũng với mong muốn giảm bớt thời gian tính toán đó nên trong chương
này ta cũng đưa ra thuật toán cải tiến của thuật toán Quickhull.
3.1 Xóa điểm
Trong mục này ta sẽ trình bày việc xóa bớt những điểm không thuộc vào bao
lồi của một tập hợp điểm. Ở định nghĩa 2.3 ta đã định nghĩa tám điểm thuộc
bao lồi là điểm tận cùng bên trái dưới, bên phải dưới, bên trái trên, bên phải
trên, bên dưới trái, bên dưới phải, bên trên trái và bên trên phải. Trong chương
này ta sẽ gọi chúng là các điểm cực. Rõ ràng các điểm nằm bên trong đa giác
nối các điểm này sẽ không thuộc bao lồi. Vì vậy ta sẽ xóa các điểm nằm phía
trong đa giác nối các điểm cực và bao lồi của tập điểm ban đầu chính là bao lồi
của tập điểm còn lại. Thuật toán 11 trình bày việc xóa điểm của tập P gồm n
điểm p1, p2, ..., pn. Đầu tiên là tìm tám điểm cực q1, . . . , q8 và gán chúng vào tập
Q. Khi nối tám điểm này ta có thể có các trường hợp như hình 3.1. Vì các đoạn
thẳng q2q3, q4q5, q6q7 và q8q1 nằm trên biên của bao lồi nên không còn điểm nào
nằm bên trái các đoạn thẳng này nữa. Vì vậy khi loại bỏ các điểm bên trong đa
giác nối các điểm cực thì các điểm còn lại là các điểm nằm bên trái các đoạn
thẳng q1q2 nếu q1 6= q2, q3q4 nếu q3 6= q4, q5q6 nếu q5 6= q6 và q7q8 nếu q7 6= q8. Vì
vậy bước tiếp theo của thuật toán ta tìm các điểm của P nằm bên trái các đoạn
39
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
thẳng q1q2, q3q4, q5q6, q7q8 và thêm chúng vào Q. Như vậy các điểm trong tập Q là
các điểm còn lại của tập P sau khi loại bỏ các điểm phía trong đa giác nối các
điểm cực. Bây giờ ta đi xét độ phức tạp tính toán của thuật toán 11. Ở bước 1
ta đi tìm tám điểm cực của tập điểm P gồm n điểm, tìm mỗi điểm ta có độ phức
tạp là O(n) vì vậy độ phức tạp của bước 1 là O(n). Bước 2 cũng có độ phức tạp
là O(n). Vì vậy thuật toán 11 có độ phức tạp tính toán tổng cộng là O(n).
Algorithm 11 Thuật toán xóa điểmInput: Tập P gồm n điểm, giả sử n ≥ 2.Output: Tập Q là các điểm còn lại của tập P sau khi xóa các điểm nằm phía trong đa giác nối cácđiểm cực của tập P .
1. (a) Gán q1 là điểm tận cùng bên trái trên, q2 là điểm tận cùng bên trên trái,q3 là điểm tận cùng bên trên phải, q4 là điểm tận cùng bên phải trên,q5 là điểm tận cùng bên phải dưới, q6 là điểm tận cùng bên dưới phải,q7 là điểm tận cùng bên dưới trái, q8 là điểm tận cùng bên trái dưới.
(b) Gán Q := q1.For i =1 to 6 do
If qi 6= qi+1 then Q = Q ∪ qi+1.
If q8 6= q1 và q8 6= q7 then Q = Q ∪ q8.
2. For each u in P do
If (q1 6= q2) then gán M12 := Orient(q1, q2, u)else M12 = 0.
If (q3 6= q4) then gán M34 := Orient(q3, q4, u)else M34 = 0.
If (q5 6= q6) then gán M56 := Orient(q5, q6, u)else M56 = 0.
If (q3 6= q4) then gán M78 := Orient(q7, q8, u)else M78 = 0.
If (M12 > 0) or (M34 > 0) or (M56 > 0) or (M78 > 0) then
gán Q := Q ∪ {u}.
3. Return Q.
40
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) (b) (c)
Hình 3.1 Các điểm cực đặc biệt.
3.2 Cải tiến thuật toán Quickhull
Ở chương 2 ta đã biết thuật toán Quickhull có độ phức tạp tính toán xấu
nhất là O(n2). Nhưng thời gian trung bình của thuật toán này lại gần với độ
phức tạp tính toán tốt nhất được biết đến nay là O(n log n). Độ phức tạp tính
toán của thuật toán Quickhull cũng giống như thuật toán Quicksort nhưng trên
thực tế thì thời gian trung bình của Quicksort hoạt động tốt hơn nhiều thời
gian xấu nhất của nó, xem ở [16]. Do đó tuy chưa có một tính toán nào đủ lớn
để so sánh các thuật toán tìm bao lồi với nhau thì ta cũng có thể hy vọng thực
tế Quickhull hoạt động tốt hơn nhiều thời gian xấu nhất của nó và do đó hoàn
toàn hợp lý khi ta tiến hành cải tiến thuật toán Quickhull. Ta thấy rằng trong
thuật toán Quickhull ở chương 2 có một số phép toán bị lặp lại. Ở bước 2 của
Findhull nếu ta tìm điểm r xa pq nhất bằng cách tìm điểm r sao cho diện tích
của tam giác pqr lớn nhất dựa vào công thức
Spqr =1
2|Orient(p, q, r)|
thì ta có thể kết hợp việc tìm điểm r này cùng với bước 1 của Quickhull khi tìm
tập P1 và P2. Như vậy ở mỗi lần gọi Findhull ta đã có sẵn điểm r mà không phải
tìm lại nữa nên có thể tiết kiệm được thời gian tính toán. Thuật toán 12 mô tả
sự cải tiến này của thuật toán Quickhull.
41
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Algorithm 12 Thuật toán Quickhull cải tiếnInput: Tập P gồm n điểm, giả sử n ≥ 2.Output: Tập H gồm các điểm là đỉnh của conv(P ).
1. Tìm điểm p tận cùng bên trái và điểm q tận cùng bên phải, gán H := p.
2. Gán P1 := ∅, P2 := ∅,max := 0,min := 0.
3. For i = 1 to n do
gán Mi := Orient(p, q, pi).
If Mi > 0 then
gán P1 := P1 ∪ {pi}.If Mi > max then gán max :=Mi, r1 := pi.
If Mi < 0 then
gán P2 := P2 ∪ {pi}.If Mi < min then gán min :=Mi, r2 := pi.
4. Gọi Findhull (P1, p, q, r1).
5. Gán H := H ∪ {q}.
6. Gọi Findhull (P2, q, p, r2).
Findhull(Pk, p, q, rk).
1. If Pk = ∅ then return.Else
gán S1 = ∅, S2 = ∅,max1 := 0,max2 := 0.
For each u in P do
gán M1 := Orient(p, rk, u),M2 := Orient(rk, q, u).If M1 > 0 then
gán S1 := S1 ∪ {u}.If M1 > max1 then gán max1 :=M1, t1 := u.
If M2 > 0 thengán S2 := S2 ∪ {u}.If M2 > max2 then gán max2 :=M2, t2 := u.
2. Gọi Findhull(S1, p, rk, t1).
3. Gán H := H ∪ {rk}.
4. Gọi Findhull(S2, rk, q, t2).
Nhận xét 3.1. Trong hàm Findhull của thuật toán 12 ta thấy điểm rk là xa pq
nhất nên không tồn tại điểm u nào thỏa mãn
Orient(p, rk, u) > 0 và Orient(rk, q, u) > 0.
Nhận xét 3.2. Phép tính cơ bản của thuật toán Quickhull và Quickhull cải
tiến là phép tính Orient. Trong thuật toán Quickhull để tìm P1 và P2 ta phải
42
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
tính Orient n− 2 lần cho n− 2 điểm của tập P\{p, q}. Để tìm r1 ta tính Orient
cho các điểm nằm trong tập P1 và để tìm r2 thì ta tính Orient cho các điểm
nằm trong tập P2. Khi đó để tìm r1 và r2 ta cũng phải tính Orient n− 2 lần như
tìm hai tập P1 và P2. Như vậy để tìm P1, P2, r1, r2 ở thuật toán Quickhull thì ta
mất tổng cộng 2n − 4 lần tính Orient. Còn trong thuật toán Quickhull cải tiến
để tìm P1, P2, r1, r2 ta chỉ cần n− 2 lần tính Orient. Vì ở thuật toán này mỗi lần
tính Orient(p, q, pi) để xét xem pi thuộc tập P1 hay P2 thì cũng đồng thời so sánh
để tìm điểm r1 và r2. Do đó bước tìm P1, P2, r1, r2 của thuật toán Quickhull cải
tiến thì số phép tính Orient đã giảm đi một nửa. Ở bước gọi Findhull(Pk, p, q)
của thuật toán Quickhull, để tìm tập S1 và S2 ta phải tính Orient cho các điểm
nằm trong tập Pk, giả sử Pk có m điểm thì ta phải tính Orient m lần. Sau đó
để tìm điểm t1 ta phải tính Orient cho những điểm nằm trong tập S1 và để tìm
điểm t2 ta phải tính Orient cho những điểm nằm trong tập S2. Như vậy những
điểm nằm trong tập S1 và S2 được tính Orient hai lần. Giả sử S1 và S2 lần lượt
có số điểm là m1 và m2 thì để tìm S1, S2, t1 và t2 thì ta tính Orient m+m1 +m2
lần. Còn đối với Findhull(Pk, p, q, rk) của Quickhull cải tiến thì chỉ tính Orient
m lần cho các điểm nằm trong tập Pk để tìm tập S1 và S2 đồng thời tìm t1 và
t2. Như vậy ở đây ta đã giảm được m1 +m2 phép gọi hàm Orient.
Nhận xét 3.3. Ta cũng có thể làm tốt hơn nữa thuật toán Quickhull cải tiến
ở các bước tìm Orient. Giả sử để tìm các điểm bên trái đoạn thẳng prk, thì với
mỗi u ta phải tính Orient(p, rk, u). Nếu gọi tọa độ các điểm p, rk, u lần lượt là
p(px, py), rk(rkx , rky) và u(ux, uy) thì trong trường hợp tính bằng định thức cấp ba
ta có
Orient(p, rk, u) =
∣∣∣∣∣ 1 px py1 rkx rky1 ux uy
∣∣∣∣∣ .Khi tính trực tiếp các định thức cấp ba này thì
Orient(p, rk, u) = rkxuy − rkyux − pxuy + pxrky + pyux − pyrkx .
Như vậy với mỗi u ta cần sáu phép nhân, ba phép trừ và hai phép cộng để tính
Orient(p, rk, u). Nếu dùng định thức cấp hai thì
Orient(p, rk, u) =
∣∣∣∣ ux − rkx uy − rkypx − rkx py − rky
∣∣∣∣ .Tính trực tiếp các định thức này ta có
Orient(p, rk, u) = (ux − rkx)(py − rky)− (px − rkx)(uy − rky).
43
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Như vậy với mỗi u ta cần hai phép nhân và năm phép trừ để tính Orient(p, rk, u).
Dựa vào sự trùng nhau của một số phần tử trong các định thức ta có thể giảm
bớt số lượng phép tính bằng cách đặt
a = py − rky , b = pc − rkx , c = brky − arkx
thì
Orient(p, rk, u) = aux − buy + c.
Khi đó với mỗi u ta cần hai phép nhân, một phép cộng và một phép trừ để
tính Orient(p, rk, u) tức là ta đã có thể tiết kiệm được bẩy phép tính nếu dùng
định thức cấp ba và ba phép tính nếu dùng định thức cấp hai.
Với cách tính "thông minh" trên ta nói tiết kiệm được một số phép tính so
với cách tính trực tiếp cũng chỉ là kết luận trên lý thuyết. Vì mặc dù số phép
tính giảm nhưng lại thực hiện trên các số khác nên ta chưa biết thời gian tính
toán có giảm đi không. Để biết chính xác những điều này ta sẽ tính toán cụ thể
ở chương sau.
44
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Chương 4
Kết quả tính toán
Để thử nghiệm các thuật toán tìm bao lồi, ta sử dụng ngôn ngữ C++ lập
trình tạo ngẫu nhiên tập điểm với số lượng điểm lớn làm dữ liệu đầu vào. Các
thuật toán được lập trình bằng ngôn ngữ C++ và chạy trên máy tính RAM
2GB, Intel Core2Duo, 2.0 GHz.
4.1 Tạo tập hợp điểm ngẫu nhiên và thuật toán xóa điểm
Ta sử dụng hàm rand() trong C++ để khởi tạo ngẫu nhiên tọa độ (giá trị
nguyên) của từng điểm trên mặt phẳng. Để sinh ngẫu nhiên một điểm có tọa
độ nguyên (x, y) trong miền hình vuông, chẳng hạn [0, 10000]× [0, 10000], ta làm
như sau.
x = rand() % 10000;
y = rand() % 10000.
Với bộ dữ liệu điểm được sinh ngẫu nhiên trong miền hình vuông như trên, sau
khi thực hiện thuật toán xóa điểm, số điểm còn lại là rất ít (xem hình 4.1a).
Đây là một ưu điểm của thuật toán xóa điểm. Tuy nhiên, do số điểm còn lại là
rất ít nên thời gian chạy các thuật toán quick hull (quick hull cải tiến) sau khi
xóa điểm gần như bằng 0. Như vậy bộ dữ liệu đầu vào được khởi tạo theo cách
trên không đủ tốt để so sánh các thuật toán đã nêu trong chương 3.
Một trong những cách tạo dữ liệu tốt hơn và khách quan hơn cho việc thử
nghiệm các thuật toán là sinh ngẫu nhiên các điểm trong một miền hình tròn,
chẳng hạn hình tròn tâm (5000, 5000) bán kính 5000. Với mỗi điểm, tọa độ cực
của điểm đó (bao gồm bán kính và góc) sẽ được sinh ngẫu nhiên. Bán kính là
khoảng cách từ tâm hình tròn đến điểm đó, được tạo ngẫu nhiên như sau
BanKinh = rand() % 5000.
45
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
(a) Số điểm còn lại sau khi xóa của tập điểmtạo ngẫu nhiên trong hình vuông.
(b) Số điểm còn lại sau khi xóa của tập điểmtạo ngẫu nhiên trong hình tròn.
Hình 4.1 Bảng số điểm còn lại
Góc tạo bởi chiều dương của trục hoành với tia từ tâm hình tròn đến điểm đó
(đơn vị radian) được tạo ngẫu nhiên như sau
Goc = rand() % 10000.
Ta ghi lại thông tin về tọa độ Đề-các của mỗi điểm như sau.
x = 5000 + BanKinh * cos(Goc),
y = 5000 + BanKinh * sin(Goc).
Tuy nhiên để số điểm còn lại tương đối nhiều sau khi xóa và để tập điểm
không quá đối xứng tròn trịa thì các tập điểm dùng để chạy các thuật toán
trong chương này được tạo như sau: tạo 40% số điểm trong hình tròn tâm
(5000, 5000) bán kính 5000 và 60% số điểm trong hình tròn tâm (4500, 4500) bán
kính 4500. Với bộ dữ liệu sinh như trên thì số điểm còn lại sau khi áp dụng thuật
toán xóa điểm là khá nhiều (xem hình 4.1b). Điều này khắc phục được nhược
điểm của bộ dữ liệu sinh ngẫu nhiên trong miền hình vuông. Để dễ quan sát ở
46
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
đây ta đưa ra một số minh họa của một số tập điểm ngẫu nhiên với số lượng
điểm tương đối nhỏ, tạo ngẫu nhiên trong hình tròn như trình bày trên, sau khi
sử dụng thuật toán xóa điểm. Các điểm màu đỏ là các điểm bị xóa, các điểm
màu xanh là các điểm còn lại.
Hình 4.2 Số điểm còn lại sau khi xóa của tập 1000 điểm.
Hình 4.3 Số điểm còn lại sau khi xóa của tập 5000 điểm.
47
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 4.4 Số điểm còn lại sau khi xóa của tập 10000 điểm.
4.2 Các kết quả tính toán
Ở chương 3 ta đã trình bày một số thuật toán xóa điểm nhằm giảm bớt số
lượng các điểm của tập hợp đầu vào. Đồng thời đưa ra thuật toán Quickhull
cải tiến với một số kỹ thuật làm giảm bớt phép gọi Orient so với thuật toán
Quickhull cũ. Ở nhận xét 3.3 cũng nêu một cách tính Orient "thông minh" có
thể làm giảm số phép tính cơ bản nhằm mục đích giảm thời gian tính toán của
các thuật toán. Hình 4.5 là bảng thời gian tính toán minh họa thực nghiệm cho
các thuật toán nêu ở chương 3 thực hiện trên tập các điểm tạo ngẫu nhiên trong
hình tròn. Kết quả trong bảng được tính trung bình cộng từ ba lần chạy các
thuật toán. Ý nghĩa của các cột trong bảng như sau: cột 2 là thời gian chạy của
thuật toán Quickhull cũ, cột 3 là thời gian chạy của thuật toán Quickhull cải
tiến khi bỏ đi các phép lặp tính Orient (Quickhull cải tiến 1), cột 4 là thời gian
chạy của thuật toán Quickhull cải tiến có kết hợp với việc tính Orient "thông
minh" (Quickhull cải tiến 2), cột 5, 6, 7 là tổng thời gian của các thuật toán
Quickhull, Quickhull cải tiến 1, Quickhull cải tiến 2 sau khi xóa điểm và thời
gian xóa điểm ở cột 8.
48
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Hình 4.5 Bảng so sánh thời gian của các thuật toán.
Hình 4.6 là đồ thị so sánh thời gian chạy của các thuật toán nêu ở bảng trên.
Hình 4.6 Đồ thị so sánh thời gian chạy của các thuật toán.
49
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Ta sẽ dựa vào bảng số liệu trên và sử dụng công thức tính trung bình nhân
để đánh giá thời gian tăng tốc của các thuật toán. Tức là, giả sử với bộ dữ liệu
thứ i, (i = 1, . . . , k), thuật toán Quickhull cải tiến chạy nhanh gấp fi lần thuật
toán Quickhull, thì khi đó độ tăng tốc (theo nghĩa trung bình nhân) của thuật
toán Quickhull cải tiến so với Quickhull là M = k√f1.f2 . . . .fk.
Với cách tính này ta được độ tăng tốc trung bình của thuật toán Quickhull cải
tiến so với Quickhull là xấp xỉ 1.305 lần, tức là thời gian tính toán của thuật toán
Quickhull cải tiến 1 bằng 76.6% so với thời gian của thuật toán Quickhull.Tương
tự, độ tăng tốc trung bình của thuật toán Quickhull cải tiến 2, Quickhull xóa
điểm, Quickhull xóa điểm cải tiến 1, Quickhull xóa điểm cải tiến 2 so với thuật
toán Quickhull lần lượt là 1.89, 1.18, 1.31, 1.46. Hay nói cách khác, thời gian
tính toán của thuật toán Quickhull cải tiến 2, Quickhull xóa điểm, Quickhull
xóa điểm cải tiến 1, Quickhull xóa điểm cải tiến 2 lần lượt bằng 52.9%, 84.2%,
76.3%, 68.3% so với thời gian của thuật toán Quickhull.
Từ kết quả này rõ ràng thuật toán Quickhull cải tiến 2 tăng tốc mạnh nhất.
Tuy nhiên, cũng từ bảng kết quả trên, ta có thể thấy với tập điểm là dữ liệu đầu
vào có số lượng điểm lớn thì thuật toán Quickhull, Quickhull cải tiến 1, Quickhull
cải tiến 2 không cho ra kết quả. Trong khi đó các thuật toán Quickhull có xóa
điểm vẫn thực hiện được. Như vậy, khi áp dụng thuật toán xóa điểm, ta không
những tăng tốc về mặt thời gian cho các thuật toán quickhull, mà khi đó các
thuật toán còn thực hiện được trên các tập điểm có số lượng lớn hơn.
50
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Kết luận
Luận văn này trình bày một số vấn đề liên quan đến bài toán tìm bao lồi của
tập hợp điểm trên mặt phẳng.
Bài toán tìm bao lồi của tập hợp điểm trên mặt phẳng được phát biểu trong
chương 1. Tầm quan trọng của bài toán này thể hiện qua những ứng dụng đa
dạng của nó trong thực tế, chẳng hạn trong lĩnh vực nhận dạng, trong bài toán
tìm đường đi ngắn nhất cho robot, trong hệ thống thông tin địa lý GIS, trong
thống kê hay trong bài toán tìm đường kính của một tập hợp điểm. Cơ sở lý
thuyết của việc áp dụng bài toán tìm bao lồi trong các ứng dụng trên cũng được
trình bày trong chương này.
Chương 2 trình bày một số thuật toán cơ bản giải bài toán tìm bao lồi của
tập hợp điểm bất kỳ trên mặt phẳng như thuật toán gói quà, thuật toán quét
Graham, thuật toán Quickhull và thuật toán Chan.
Thuật toán Quickhull cùng một số cải tiến của thuật toán này được trình
bày trong chương 3. Các cải tiến nhằm mục đích giảm số lượng phép toán căn
bản (Orient) trong tính toán, giảm thời gian chạy chương trình. Một hướng cải
tiến quan trọng là giảm lượng điểm đầu vào cho bài toán tìm bao lồi bằng việc
áp dụng thuật toán xóa điểm. Thuật toán xóa điểm tìm các điểm cực trong tập
hợp điểm ban đầu, sau đó khai thác tính chất các điểm cực này để xóa đi các
điểm nằm trong đa giác điểm cực, nhờ đó loại đi các điểm không cần thiết khi
áp dụng các thuật toán tìm bao lồi. Chương này còn trình bày một cải tiến cho
thuật toán Quickhull và một số kỹ thuật giúp giảm số lượng các phép tính.
Chương 4 nêu các kết quả thử nghiệm thuật toán tìm bao lồi trình bày trong
chương 3. Với các bộ dữ liệu điểm đầu vào tương đối tốt và khách quan, thì
thuật toán cải tiến tốt nhất nhanh hơn thuật toán Quickhull gấp 1,92 lần. Và
một kết quả rất tốt do thuật toán xóa đểm mang lại là các thuật toán Quickhull
và Quickhull cải tiến sau khi áp dụng thuật toán xóa điểm thì có thể thực hiện
trên nhưng tập điểm lớn hơn khi không áp dụng xóa điểm. Như vậy, những cải
tiến trình bày trong chương 3 đã thực sự mang lại hiệu quả về tốc độ và khả
51
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
năng tính toán cho thuật toán Quickhull.
Trong thời gian tới, chúng tôi sẽ tiếp tục thử nghiệm các thuật toán tìm bao
lồi khác, đánh giá tác động của việc áp dụng thuật toán xóa điểm trước khi thực
hiện các thuật toán tìm bao lồi đó. Chúng tôi cũng sẽ nghiên cứu việc mở rộng
các thuật toán này cho bài toán tìm bao lồi của tập điểm trên không gian nhiều
chiều hơn.
52
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
Tài liệu tham khảo
[1] Phan Thành An and Lê Hồng Trang, A parallel algorithm based on convexity
for the computing of Delaunay tessellation, Numerical Algorithms, Springer,
2012.
[2] Administrator, Ứng dụng của GIS - Hệ thống thông tin địa lý trong các
ngành, tháng 11/2008.
[3] C. Bradford Barber, David P. Dobkin and Hannu Huhdanpaa, The Quick-
hull Algorithm for Convex Hulls, University of Minnesota, 1996.
[4] A. Bykat, Convex hull of a finite set of points in two dimensions, Informa-
tion Processing Letters, 296-298, 1978.
[5] Timothy M. Chan, Optimal Output-Sensitive Convex Hull Algorithms in
Two and Three Dimensions, Discrete Comput Geom, 361-368, 1996.
[6] William F. Eddy, A new convex hull algorithm for planar sets, ACM Trans,
Math, 398-403, 1977.
[7] B.K. Elgindy and Bhattacharya, A new linear convex hull algorithm for
simple polygons IEEE Transactions on Information Theory, 81–88, 1984.
[8] R.L. Graham, An efficient algorithm for determining the convex hull of a
finite planar set, 1972.
[9] Ronald L. Graham and Frances Yao, Finding the Convex Hull of a Simple
Polygon, Department of Computer Science, Stanford University, 1981.
[10] Phạm Ngọc Hà, Các mô hình dữ liệu Gis, 2008.
http://my.opera.com/hapn2/blog/
[11] R.A. Jarvis, On the identification of the convex hull of a finite set of points
in the plane, 18-21, 1973.
53
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn
[12] Yan-Bin Jia and Huan Lin, On the Convex Hulls of Parametric Plane
Curves, Department of Computer Science, 2012.
[13] David M. Mount, Computational Geometry, University of Maryland, 11-19,
2002.
[14] Trần Bình Nguyên, Hệ thống nhận diện biển số xe, 2011.
http://www.ieev.org/2011/01/tong-quan-ve-he-thong-nhan-dien-bang-so.
html#comment-post-message
[15] J. O’Rourke, Computational Geometry in C, 2nd edn, Cambridge University
Press, Cambridge, 1998.
[16] Sheldon M. Ross, Introduction to Probability Models, 10th edition, Elsevier,
2010.
[17] F.P. Preparata and M.I. Shamos, Computational Geometry: An Introduc-
tion, Springer-Verlag New York Inc, 1985.
[18] Suneeta Ramaswami, Convex Hulls: Complexity and Applications (A Sur-
vey), University of Pennsylvania, 1993.
[19] Trần Vũ Thiệu, Cơ sở giải tích lồi, Viện toán học, Hà Nội 4-2011.
[20] Cormen H. Thomas, Leiserson E. Charles, Rivest L. Ronald and Stein Clif-
ford, Introduction to algorithms, 3rd edn, The MIT Press, American, 2001.
54
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên http://www.lrc-tnu.edu.vn