bài toán tìm bao lồi

54
B¸ GIÁO DC VÀ ĐÀO TO TRƯ˝NG ĐI H¯C KHOA H¯C NGUY™N KIU LINH BÀI TOÁN TÌM BAO L˙I LUN VĂN THC S Chuyên ngành : TOÁN NG DNG Mã sL : 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

Upload: lam-duong-duc

Post on 03-Jan-2016

561 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Bài toán tìm bao lồi

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

Page 2: Bài toán tìm bao lồi

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

Page 3: Bài toán tìm bao lồi

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

Page 4: Bài toán tìm bao lồi

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

Page 5: Bài toán tìm bao lồi

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

Page 6: Bài toán tìm bao lồi

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

Page 7: Bài toán tìm bao lồi

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

Page 8: Bài toán tìm bao lồi

(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

Page 9: Bài toán tìm bao lồi

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

Page 10: Bài toán tìm bao lồi

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

Page 11: Bài toán tìm bao lồi

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

Page 12: Bài toán tìm bao lồi

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

Page 13: Bài toán tìm bao lồi

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

Page 14: Bài toán tìm bao lồi

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

Page 15: Bài toán tìm bao lồi

độ 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

Page 16: Bài toán tìm bao lồi

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

Page 17: Bài toán tìm bao lồi

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

Page 18: Bài toán tìm bao lồi

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

Page 19: Bài toán tìm bao lồi

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

Page 20: Bài toán tìm bao lồi

(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

Page 21: Bài toán tìm bao lồi

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

Page 22: Bài toán tìm bao lồi

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

Page 23: Bài toán tìm bao lồi

(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

Page 24: Bài toán tìm bao lồi

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

Page 25: Bài toán tìm bao lồi

(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

Page 26: Bài toán tìm bao lồi

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

Page 27: Bài toán tìm bao lồi

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

Page 28: Bài toán tìm bao lồi

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

Page 29: Bài toán tìm bao lồi

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

Page 30: Bài toán tìm bao lồi

(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

Page 31: Bài toán tìm bao lồi

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

Page 32: Bài toán tìm bao lồi

(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

Page 33: Bài toán tìm bao lồi

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

Page 34: Bài toán tìm bao lồi

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

Page 35: Bài toán tìm bao lồi

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

Page 36: Bài toán tìm bao lồi

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

Page 37: Bài toán tìm bao lồi

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

Page 38: Bài toán tìm bao lồi

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

Page 39: Bài toán tìm bao lồi

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

Page 40: Bài toán tìm bao lồi

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

Page 41: Bài toán tìm bao lồi

(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

Page 42: Bài toán tìm bao lồi

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

Page 43: Bài toán tìm bao lồi

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

Page 44: Bài toán tìm bao lồi

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

Page 45: Bài toán tìm bao lồi

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

Page 46: Bài toán tìm bao lồi

(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

Page 47: Bài toán tìm bao lồi

đâ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

Page 48: Bài toán tìm bao lồi

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

Page 49: Bài toán tìm bao lồi

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

Page 50: Bài toán tìm bao lồi

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

Page 51: Bài toán tìm bao lồi

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

Page 52: Bài toán tìm bao lồi

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

Page 53: Bài toán tìm bao lồi

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

Page 54: Bài toán tìm bao lồi

[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