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

Thuật toán tăng dần ngẫu nhiên tìm tam giác phân delaunay

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (945.75 KB, 42 trang )

Bộ giáo dục và đào tạo
Tr-ờng Đại học Vinh

nguyễn hồng quân

thuật toán tăng dần ngẫu nhiên
tìm tam giác phân delaunay

Chuyên ngành: Hình học - tôpô
MÃ số: 60.46.10

luận văn thạc sĩ toán học

Cán bộ h-ớng dẫn khoa học:
PGS. TS. Phan Thành An

Vinh - 2011


MỤC LỤC
Trang
MỞ ĐẦU .......................................................................................................... 1
CHƢƠNG I. TAM GIÁC PHÂN DELAUNAY ........................................... 3
1.1. Định nghĩa và các tính chất của tam giác phân Delaunay ....................... 3
1.2. Phép tam giác phân Delaunay.................................................................. 7
1.3. Độ phức tạp của thuật toán .................................................................... 12
CHƢƠNG II. THUẬT TỐN TÌM TAM GIÁC PHÂN DELAUNAY ... 15
2.1. Thuật tốn sử dụng bao lồi dưới trong R3 để tìm tam giác phân
Delaunay ................................................................................................ 15
2.3. So sánh thuật toán sử dụng bao lồi dưới trong R3 để tìm tam giác
phân Delaunay và thuật tốn tăng dân ngẫu nhiên tìm tam giác


phân Delaunay ....................................................................................... 38
KẾT LUẬN .................................................................................................... 39
TÀI LIỆU THAM KHẢO ............................................................................ 40


1

MỞ ĐẦU
Bài toán xây dựng tam giác phân Delaunay là một trong các bài tốn
cơ bản trong hình học tính tốn và nó được sử dụng trong rất nhiều lĩnh vực
như thông tin địa (GIS), phần tử hữu hạn, đồ họa máy tính và đa phương tiện
… Năm 1934 nhà toán học người Nga B.Delaunay (1890-1980) đã đưa ra bài
toán xây dựng tam giác phân Delaunay (xem [3]). Vì những ứng dụng to lớn
của tam giác phân Delaunay trong các lĩnh vực nói trên nên nhiều nhà tốn
học đã nghiên cứu đưa ra thuật toán xây dưng tam giác phân Delaunay. Điển
hình là các cơng trình của Dwyer với thuật toán chia để trị, thuật toán quét
(Sweep line) của Fortunne (1987) thuật toán tăng dần (Incremental) của
Preparata và Shamos (1985)…(xem [4]). Với các thuật tốn nói trên, trên cơ
bản đã xây dựng được tam giác phân Delaunay từ tập các điểm đã cho, nhưng
độ phức tạp thời gian của chúng khá lớn. Do vậy, một số nhà toán học đã tìm
thuật tốn tăng dần ngẫu nhiên nhằm mang lại hiểu quả cao hơn đáp ứng với
yêu cầu của cuộc sống hiện đại như xử lí các vấn đề ở tốc độ cao và số lượng
lớn. Cũng xuất phát từ yêu cầu đó trong luận văn này tác giả trình bày lại
thuật tốn tăng dần ngẫu nhiên tìm tam giác phân Delaunay (xem [3]) va có
đưa thêm thuật tốn sử dụng bao lồi dưới trong R3 tìm tam giác phân
Delaunay (xem [3]) để so sánh với thuật toán trên.
Luận văn gồm hai chương.
Chƣơng I Tam giác phân Delaunay
1.1. Định nghĩa và các tính chất của tam giác phân Delaunay
1.2. Phép tam giác phân Delaunay

1.3. Độ phức tạp của thuật toán
Chƣơng II Thuật tốn tìm tam giác phân Delaunay
2.1. Thuật tốn sử dụng bao lồi dưới trong R3 tìm tam giác phân Delaunay


2
2.2. Thuật tốn tăng dần ngẫu nhiên tìm tam giác phân Delaunay
2.3 So sánh thuật toán sử dụng bao lồi dưới trong R3 để tìm tam giác
phân Delaunay và thuật tốn tăng dân ngẫu nhiên tìm tam giác phân Delaunay
Luận văn được hoàn thành vào tháng 10 năm 2011 tại khoa đào tạo sau
đại học và khoa toán trường Đại học Vinh dưới sự hướng dẫn của PGS.TS
Phan Thành An. Tác giả xin bày tỏ lòng biết ơn sâu sắc đến thầy, người đã tận
tình chỉ dẫn, giảng dạy chúng tơi trong suốt q trình học tập và nghiên cứu.
Tác giả xin chân thành cảm ơn PGS.TS Nguyễn Hữu Quang, PGS.TS
Phạm Ngọc Bội, TS Nguyễn Duy Bình đã giảng dạy, chỉ bảo những vấn đề có
liên quan đến đề tài nghiên cứu.
Tác giả xin chân thành cảm ơn các GS, PGS, TS… khoa sau đại học
và khoa toán Đại học Vinh, Viện Toán Học, những người đã tham gia quản
lý, giảng dạy giúp đỡ và hướng dẫn tác giả trong suốt quá trình học tập và
nghiên cứu.
Tác giả cũng gửi lời cảm ơn tới tập thể K17 Hình Học - Tơpơ, gia đình,
bạn bè, đồng nghiệp đã giúp đỡ và động viên tác giả trong q trình hồn
thành luận văn.


3

CHƢƠNG I
TAM GIÁC PHÂN DELAUNAY
1.1. Định nghĩa và các tính chất của tam giác phân Delaunay

1.1.1. Định nghĩa. (xem [3]). Trong mặt phẳng Oxy cho tập P gồm n điểm
P = {p1, p2,…pn}. Tam giác phân của hệ điểm P là tập hợp các tam giác
pipjpkP sao cho hai tam giác bất kì trong P khơng có chung điểm trong chỉ
có chung cạnh hoặc chung đỉnh.
Ví dụ: trong mặt phẳng Oxy cho bốn điểm p1, p2, p3, p4 là một tứ giác khi đó
có hai cách cho tam giác phân là
{p1p2p3; p1p3p4}

{p1p2p4; p2p3p4}

1.1.2. Định nghĩa. (xem [3]). Trong mặt phẳng Oxy cho tập P gồm n điểm
P = {p1, p2,…pn}. Phép tam giác phân tập P sao cho phần trong của hình trịn
qua ba đỉnh một tam giác bất kì không chứa một điểm nào khác của P, được
gọi là phép tam giác phân Delaunay. Kí hiệu D(P).
Mỗi tam giác phân D(P) được gọi là tam giác Delaunay, mỗi cạnh của
tam giác Delaunay được gọi là cạnh Delaunay.


4
Hình 1 Tam giác phân Delaunay

1.1.3. Định nghĩa. (xem[4] - trang 75). Một cạnh Delaunay được gọi là cạnh
trong nếu nó là cạnh chung của đúng hai tam giác Delaunay.
Một cạnh Delaunay được gọi là cạnh biên nếu nó là cạnh của duy nhất
một tam giác Delaunay.
Tập các cạnh biên được gọi là biên của D(P).
1.1.4. Tính chất. (xem [4] - trang 89). Biên của D(P) là biên của bao lồi tập
các điểm của P.
1.1.5. Tính chất. (xem [4] - trang 102). Nếu P có k đỉnh nằm trên biên của
bao lồi thì D(P) có 2n - 2 - k tam giác và 3n - 3 - k cạnh.

Chứng minh.
Gọi n, nv, ne lần lượt là số đỉnh, số tam giác và số cạnh của D(P). Theo
giải thiết, P có k đỉnh nằm trên biên của bao lồi nên D(P) có k cạnh biên.
Vì mỗi cạnh biên là cạnh của duy nhất một tam giác và mỗi cạnh trong
là cạnh chung của đúng hai tam giác nên số cạnh của D(P) là:
ne 

3nv  k
1
 k  (3nv  k )
2
2

(1)

mặt khác, theo hệ thức Euter ta có:
n - ne + (nv + 1) = 2

(2)

Từ (1) và (2) ta có điều phải chứng minh.
1.1.6. Tính chất. (xem [5] - trang 186). D(P) là duy nhất nếu hình trịn đi qua
ba đỉnh bất kì của P khơng chứa điểm nào khác của P.
1.1.7. Tính chất. (xem [5] - trang 186). (mối quan hệ giữa tam giác phân
Delaunay trong mặt phẳng và bao lồi của tập hữu hạn điểm trong không gian
ba chiều) Gọi P' = { p1' ,p'2 ,...,p'n } là tập hình chiếu của tập các điểm
P = {p1, p2,…,pn} trong mặt phẳng Oxy lên parabollid z = x2 + y2. Khi đó
D(P) chính là kết quả của phép chiếu bao lồi dưới LF(P') lên mặt phẳng Oxy.



5

1.1.8. Định nghĩa biểu đồ Voronoi (xem [2])
Cho P = {p1, p2,…pn} là tập n điểm phân biệt trong E3 gọi chúng là các
vị trí. Biểu đồ Voronoi là một phân hoạch phẳng của P thành n miền. Mỗi
miền ứng với một điểm trong P sao cho nếu điểm p thuộc miền ứng với pi thì





V ( pi )  x \ pi  x  p j  x , j  i ký hiệu V(P)

1.1.9. Các tính chất của tam giác phân Delaunay và biểu đồ Voronoi
- Biên của D(P) là bao lồi của các vị trí của V(P)
- Phần trong của các mặt (các tam giác) của D(P) khơng chứa một vị trí
nào của V(P).
- Mỗi miền V(Pi) là lồi.
- V(Pi) không bị chặn nếu và chỉ nếu Pi nằm trên bao lồi của các vị trí P
(tức Pi) là đỉnh cực biên của bao lồi.
- Nếu đỉnh Voronoi V là chung của V(P1), V(P2), V(P3) thì V là tâm
của hình trịn C(V) xác đỉnh bởi p1, p2, p3. (xem hình 1)
- Phần trong của hình trịn khơng chứa vị trí nào của V(P).
- Nếu pi là một vị trí kề với pj thì pi p j là một cạnh của D(P).

Hình 2 (tam giác phân Delaunay biểu diễn
bằng các nét đứt đoạn biểu đồ Voronoi biểu diễn bằng nét liền)


6

1.1.10. Tính chất. (xem [1]) ab  V(P) nếu và chỉ nếu có một hình trịn rỗng
qua a và b.
Chứng minh.
a) Nếu ab  V(P) thì V(a), V(b) có chung cạnh c nào đó của V(P). Lấy x
thuộc phần trong của C(x) nếu hình trịn C(x) bán kính x  a  x  b thì
C(x) rỗng.
b) Nếu có một hình trịn nào đó C(x) qua a và b thì bán kính của C(x) là
x  a  x  b do đó x thuộc các miền Voronoi của a và b chừng nào

khơng có điểm khác gây chở ngại đến tính "lân cận gần nhất". Nhưng
chẳng có điểm nào gây chở ngại cả vì C(x) là hình trịn rỗng nên x  V(a)
 V(b). Vì khơng có vị trí nào thuộc biên của C(x) (trừ a và b) nên ta có
thể di chuyển x trên phần dương của đường trung trực của đoạn ab mà vẫn
giữ được tính rỗng của C(x).
Như vậy x trên phần dương của đường trung trực của cạnh Voronoi của
chung giữa V(a) và V(b). Do đó ab  V(P).
1.1.11. Định nghĩa. (xem [3]). Cho P là đa giác đơn
+) Với a-, a, a+ là ba đỉnh liên tiếp của một đa giác đơn, b là một đỉnh khác
của đa giác đơn đó ta gọi ab là đường thẳng trong lân cận a nếu ab trong góc
trong a aa  .
+) Với hai điểm a, b nếu ta viết ab thì đó là đường thẳng có hướng từ a đến b,
nếu viết là ba thì đó là đường thẳng có hướng từ b đến a
1.1.12. Tính chất. (xem [3]).
Mọi đa giác đơn P đều tam giác phân được. Một đa giác đơn có n - 3
đường chéo thì n - 2 tam giác được tạo thành.
1.1.13. Định nghĩa. (xem [1])
Xét vị trí tương đối của một điểm với đường thẳng định hướng


7

cho a, b, c  R2 trong đó a(a0, a1), b(b0, b1), c(c0, c1). Xét giá trị
S = (b0 - a0)(c1 - a1) - (b1 - a1)(c0 - a0) (*)
- Nếu S > 0 thì c bên trái ab
- Nếu S < 0 thì c bên phải ab
- Nếu S = 0 thì c ở trên ab
1.1.14.Định nghĩa. Trong R 3 cho mặt phẳng  có phương trình ax + by + cz
+ d = 0. Và điểm M( x0 ; y0 ; z 0 ). Gọi M'( x0 ; y0 ; m ) là điểm thuộc mặt phẳng  .
Khi đó ta nói
-Điểm M thuộc mặt phẳng  nếu z 0 = m
- Điểm M nằm phía trên mặt phẳng  nếu z 0 > m
- Điểm M nằm phía dưới mặt phẳng  nếu z 0 < m
1.1.15. Nhận xét. Gọi n (a, b, c) là véc tơ pháp tuyến của mặt phẳng  và
c < 0. Khi đó M( x0 ; y0 ; z 0 ) nằm phía trên (hoặc thuộc) mặt phẳng  khi và chỉ
khi n .M ' M  0
Chứng minh.
Ta có: M ' M (0;0; z 0  m)  n .M ' M  c( z 0  m) .
Do đó ta có: n .M ' M  0  c( z 0  m)  0  z 0  m
Vậy, theo định nghĩa 1.1.14 ta có điều phải chứng minh.
1.2. Phép tam giác phân Delaunay
1.2.1. Tính chất. (xem [3]). Nếu (C) là một hình trịn thì l giao với (C) được
một đoạn thẳng tại các điểm a và b, và p, q, r và s là các điểm nằm trên cùng
phía l. Giả sử p và q nằm trên (C) mà r nằm bên trong (C), và S nằm phía
ngồi (C) thì. arb  apb  aqb  asb (xem hình 4)


8
pl

pl


' 2 ' 4

2

pi

3
5

l
4

pj

6

S

pk

q
p

Hình 3a

' 6

pi  ' l
' 3 ' 5


pk
Hình 3b

r
l
b
C

a

Hình 4
Bây giờ xét xem một cạnh e = pi p j của tứ giác H. Nếu hai tam giác tạo
thành từ một tứ giác chúng ta có thể có được một tứ giác mới H' bằng cách gỡ
bỏ pi p j trong H và chèn pk pl thay thế. Ta gọi là thay thế một cạnh. Sự khác
biệt duy nhất trong góc của H và H' là sáu góc 1,…,6 trong (H) được thay
thế bằng 1' ,...6' trong (H'). Gọi cạnh e = pi p j nếu min i  min i '. (xem
1 i 6

1 i 6

hình 2a và 2b)
1.2.2. Bổ đề. (xem [3] - trang 195). Cho bốn điểm pi, pj, pk, pl là 1 hình tứ giác
lồi và khơng nằm trong một hình trịn chung. Giả sử (C) là hình trịn qua pi, pj,
pk. Cạnh pi p j là bất hợp pháp nếu và chỉ nếu điểm pl nằm trong hình trịn (C).
(xem hình 5)

pj


9


pl
pi

pj
pk
Bất hợp pháp
Hình 5

1.2.3. Thuật tốn thay thế tam giác phân thành một tam giác phân hợp
pháp. (xem [3] - trang 195).
Algorithm Legaltriangulation (T) (tam giác phân hợp pháp)
Đầu vào. T là một tam giác phân nào đó của tập hợp điểm P.
Đầu ra. Một tam giác phân hợp pháp của P.
1. while T chứa cạnh bất hợp pháp pi p j
2.

do (*Thay thế pi p j *)

3.

Giả sử pipjpk và pipjpl là hai tam giác tiếp giáp với pi p j .

4.

Bỏ đi pi p j từ T, và thêm vào p k pl thay thế.

5. return T
1.2.4. Tính chất. (xem [3] - trang 198). Giả sử P là một tập hợp các điểm trên
mặt phẳng. Ba điểm pi, pj, pk thuộc P là các đỉnh của tam giác phân Delaunay

đồ thị của P nếu và chỉ nếu hình trịn qua pi, pj, pk khơng chứa điểm nào của P
trong nó.
1.2.5. Tính chất. (xem [3] - trang 198). Giả sử P là một tập hợp các điểm
trong mặt phẳng và giả sử T là một tam giác của P. Sau đó T là một tam giác
phân Delaunay của P nếu và chỉ nếu hình trịn ngoại tiếp của bất kỳ tam giác
của T không chứa một điểm nào của P.


10
1.2.6. Bổ đề. (xem [3] - trang 202). Mỗi cạnh mới tạo ra trong tam giác phân
Delaunay hoặc trong LEGALIZEEDGE trong quá trình chèn pr là một cạnh
của đồ thị Delaunay của {p-1, p-2, p0,…,pr}.
Đầu tiên ta bắt đầu với một tam giác lớn hơn chứa tập hợp các điểm
của P.
p0
p-2

p-1
Hình 6
Thêm hai điểm p-1 và p-2, cùng với điểm có tung độ cao nhất p0 của P,
tạo thành một tam giác chứa tất cả các điểm của P (xem hình 6). Điều này có
nghĩa là đang tính với một tập hợp điểm P  {p-1, p-2} thay cho tập hợp điểm
của P. Sau đó muốn có được những tam giác phân Delaunay của P bằng cách
loại bỏ p-1, p-2 cùng với tất cả các cạnh nối đến hai điểm này. Để làm việc này
phải chọn p-1 và p-2 đủ xa các điểm trong P để nó khơng phá huỷ bất kỳ hình
tam giác Delaunay của P. Đặc biệt, phải đảm bảo chúng khơng nằm trong bất
kỳ hình trịn xác định bởi ba điểm tại P.
Khi bổ sung một điểm p r. Tìm thấy những hình tam giác đầu tiên của
tam giác hiện tại có chứa p r. Nếu pr nằm trong tam giác thêm cạnh từ p r đến
các đỉnh của tam giác. Nếu p r nằm trên một cạnh e của tam giác thêm các

cạnh từ pr đến các đỉnh đối diện trong e. Hình 7a và 7b minh hoạ hai
trường hợp


11
pk

pi
pr

pk

pl

pr
pj

pi

pj
Hình 7b

pj

Hình 7a
pr nằm bên trong pipjpk

pr nằm trên cạnh pipj của  pipjpk

Một tam giác nhưng không nhất thiết là một tam giác phân Delaunay là

bởi vì việc bổ sung pr có thể làm cho một số các cạnh đã có bất hợp pháp. Để
khắc phục tình trạng này, ta sử dụng trương trình con LEGALIZEEDGE để
thay thế cạnh bất hợp pháp.
Tiếp theo ta nói về các chi tiết của sự thay đổi tam giác nhận được sau
khi dòng 9 (hoặc dịng 14) của thuật tốn trong muc 2.2.2 thành một tam giác
phân Delaunay. Ta đã biết từ tính chất 1.2.6 rằng một tam giác là một tam
giác phân Delaunay nếu tất cả các cạnh của nó là hợp pháp.
Chúng ta quan sát rằng cạnh pi p j đó là thay đổi pháp lý trước khi có
thể trở thành bất hợp pháp nếu một trong các sự cố để nó có hình tam giác
thay đổi. Vì vậy chỉ có cạnh của tam giác mới cần được kiểm tra. Điều này
được thực hiện bằng cách sử dụng chương trình con LEGALIZEEDGE.
LEGALIZEEDGE (pr, pi p j , T)
1. (* Các điểm được đưa vào là pr, và pi p j là cạnh của T có thể cần. *)
2. if pi p j là bất hợp pháp

pk

pj

3. then Giả sử pipjpk được tam giác kề
với prpipj dài hơn pi p j .
pi

Pr
Hình 8


12
4.


(* Flip pi p j : *) Thay thế pi p j với p r p k .

5.

LEGALIZEEDGE (pr, pi p k , T)

6.

LEGALIZEEDGE (pr, p k p j , T)

Các thử nghiệm ở bước 2 của thuật toán này có một cạnh là bất hợp pháp
thường có thể được thực hiện bằng cách áp dụng bổ đề 1.2.2
1.3. Độ phức tạp của thuật toán
Độ phức tạp của thuật toán là thước đo để so sánh tính hiệu quả của
thuật tốn. Một thước đo hiệu quả đó là thời gian máy tính sử dụng để giải bài
tốn đang xét, khi các giá trị đầu vào có một kích thước xác định. Một thước
đo thứ hai đó là kích thước bộ nhớ địi hỏi thực hiện thuật tốn khi giá trị đầu
vào có một kích thước cho trước.
Gắn liền với thời gian tính tốn là độ phức tạp thời gian và bộ nhớ là độ
phức tạp không gian.
Xác định được độ phức tạp thời gian của thuật toán là rất quan trọng.Vì
khi đó ta biết được thời gian tính tốn là một phút, một năm hay một tỉ năm
để thực hiện thuật tốn đó. Độ phức tạp khơng gian của thuật tốn đó cho ta
biết được một bước chuẩn bị và thấy được khả năng đáp ứng trong việc tính
tốn của thuật tốn.
Trong luận văn nay chúng tơi khơng nghiên cứu về cơ sở dữ liệu nên ta
bỏ qua độ phức tạp không gian, chỉ nghiên cứu độ phức tạp thời gian.
Để xác định độ phức tạp của thuật toán ta chỉ xét những hàm thực
f : N  R xác định trên tập số nguyên dương và tập giá trị hầu như dương
làm công cụ đo. Nghĩa là tồn tại số tự nhiên n0 sao cho với mọi n  n0 thì

f(n) > 0. Kí hiệu £ là tập hợp các hàm như vậy.
1.3.1. Định nghĩa. (xem [2]) Cho hàm số g(n)  £, ta định nghĩa O(g(n)) là
tập hợp các hàm f(n)  £ có tính chất: tồn tại hằng số dương c và số tự nhiên


13
n0 sao cho với mọi n  n0 thì f(n)  c.g(n). Nếu f(n)  O(g(n)) thì ta nói rằng
f(n) là Ơ lớn của g(n).
1.3.2. Tính chất. (xem [2]) Nếu f1(n) ∈ O(g1(n)) và f2(n) ∈ O(g2(n)) thì f1(n)
+ f2(n) ∈ O(g1(n) + g2(n)).
Chứng minh. Giả sử rằng với mọi n > n1, f1(n)  c1g1(n), và với mọi n  n2,
f1(n)  c2g2(n).
Ta đặt n0 = max(n1,n2) và c0 = max(c1,c2). Khi đó với mọi n  n0 ta có:
f1(n) + f2(n) ≤ c1g1(n) + c2g2(n) ≤ c0(g1(n) + g2(n))
Vậy f1(n) + f2(n) ∈ O(g1(n) + g2(n)).
1.3.3. Tính chất. (xem [2]) Nếu f1(n) ∈ O(g1(n)) và f2(n) ∈ O(g2(n)) thì
f1(n) + f2(n) ∈ O(max(g1(n), g2(n)))
Chứng minh. Giả sử rằng với mọi n ≥ n1, f1(n)  c1g1(n), và với mọi
n  n2, f1(n)  c2g2(n).
Ta đặt n0 = max(n1,n2) và c0 = c1 + c2 khi đóvới mọi n  n0 ta có:
f1(n) + f2(n) ≤ c1g1(n) + c2g2(n) ≤ (c1 + c2)(max(g1(n), g2(n))
Vậy f1(n) + f2(n) ∈ O(max(g1(n), g2(n))
1.3.4. Tính chất: (xem [2]) Nếu f1(n) ∈ O(g1(n)) và f2(n) ∈ O(g2(n)) thì
f1(n).f2(n) ∈ O(g1(n).g2(n))
Chứng minh. Giả sử rằng với mọi n ≥ n1, f1(n)  c1g1(n), và với mọi
n  n2, f1(n)  c2g2(n).
Ta đặt n0 = max(n1,n2) và c0 = c1.c2 khi đóvới mọi n  n0 ta có:
f1(n).f2(n) ≤ c1g1(n).c2g2(n) ≤ c0(g1(n).g2(n))
Vậy f1(n).f2(n) ∈ O(g1(n).g2(n))
1.3.5. Xác định độ phức tạp tính tốn của thuật tốn (xem [2])

Ta sử dụng T là khối mã cho độ phức tạp tính tốn của một tốn tử
riêng cũng như cho một đoạn mã chương trình. Khi đoạn mã chương trình
được tách biệt rõ ràng thì ta kí hiệu T(n) là độ phức tạp tính tốn và là hàm


14
biến số n, với n là số phép toán cơ sở. Độ phức tạp tính tốn được đo bằng
hàm O(...). Vậy xác định độ phức tạp tính tốn tức là xác định hàm
T(n) ∈ O(g(n)) cho đoạn mã chương trình đó.
Các phép tốn dùng để đo độ phức tạp thời gian là phép so sánh các số
nguyên, phép cộng, trừ, nhân và chia hoặc bất kì một phép tốn sơ cấp nào
khác.
Độ phức tạp thời gian của dãy liên tiếp các phép tính được xác định bởi
độ phức tạp cao nhất trong chúng.
Tức là, giả sử tốn tử s1 có độ phức tạp F1 và tốn tử s2 có độ phức tạp
F2. Khi đó:T(s1 ∈ O(F1)), T(s2 ∈ O(F2)) ⟹ T(s1,s2) ∈ max(O(F1),O(F2)).
Để dễ dàng cho việc phân tích thuật tốn ta kết hợp những kí hiệu đo
độ phức tạp và phân tích trong trường hợp xấu nhất để biết được thời gian
thực hiện thuật toán là bao nhiêu? Người ta đinh ra độ phức tạp của các phép
toán trong trường hợp xấu nhất của thuật toán là:
1. Phép gán có độ phức tạp O(1).
2. Phép nhập và ra khỏi thủ tục có độ phức tạp O(1).
3. Mệnh đề if (điều kiện) có độ phức tạp là thời gian so sánh cộng với O(max
của hai nhánh)
4.Vịng lặp (While) có độ phức tạp là tổng tất cả vòng lặp với thời gian của
mỗi vịng lặp đó.


15


CHƢƠNG II
THUẬT TỐN TÌM TAM GIÁC PHÂN DELAUNAY
2.1. Thuật tốn sử dụng bao lồi dƣới trong R3 để tìm tam giác phân Delaunay
2.1.1. Mơ tả thuật tốn. (xem [3])
Để tìm tam giác phân Denlaunay của tập P gồm n điểm P = {p1,..,pn}
với tọa độ (xi1, xi2) ta làm như sau:
Gọi P* = { p1* ,..., pn * } trong R3 sao cho hoành độ và tung độ của p*i là
2
hồnh độ và tung độ của pi cịn cao độ xi3 của pi* là x i12  x i2
.

Tìm các bao lồi dưới của pi* và chiếu xuống mặt phẳng Oxy
Thì các mặt của bao lồi dưới của P* cho tương ứng tam giác phân
Delaunay.
2.1.2. Thuật toán
Input P = {p0,…, pn-1}.
Output D(p)
Algorithm
Xác định: Giả sử P = {p0,..,pn-1}  R2 với tọa độ (xi1, xi2),
i = 0,…,n - 1; ≥ 2
Tìm thấy: tam giác phân Delaunay của P





1. Giả sử P* = p*0 ,...,p*n 1 điểm trong R3, sao cho hoành độ và tung độ
của pi* là hoành độ và tung độ của pi còn cao độ của pi* là x i 3 = xi1 2  xi 2 2
2. Xây dựng bao lồi CH(P*) của p* trong R3
3. Chiếu xuống n mặt của CH(P*) theo hướng song song trục tọa độ gốc

R 2 (có chứa P) và quay trở lại.
2.1.3. Ví dụ Trong mặt phẳng Oxy, cho tập P gồm 5 điểm.
P = { p0 (1;8), p1 (2; 2), p2 (1;0), p3 (2;1), p4 (2;1) }


16
Dùng thuật toán sử dụng bao lồi dưới trong R3 để tìm D(P)
Giải
p0 (1;8)  p0* (1;8;65)

p3 (2;1)  p3 (2;1;5)

p1 (2;2)  p1 (2;2;8)

p4 (2;1)  p4 (2;1;5)

*

*

*

p2 (1;0)  p2 (1;0;1)
*

Trong toạ độ thứ ba của pi * được tính theo cơng thức hai thành phần đầu
để ngun toạ độ của pi, còn toạ độ thứ ba được tính theo cơng thức:
2
x i 3 = x i12  x i2
.


Tiếp theo chúng ta kiểm tra các mặt tạo thành từ các đỉnh
pi (i=0,1,2,3,4), mặt nào là mặt dưới. Để làm điều đó, chúng ta xác định véc
*

tơ pháp tuyến của mỗi mặt qua ba điểm pi * ; p j * ; p k * bất kỳ. Với ba điểm
không thẳng hàng pi * ; p j * ; p k * bất kỳ ta luôn xác định duy nhất một mặt
phẳng. Tuy nhiên, theo thuật toán này, khi thực hiện tính tốn sẽ thực hiện
tính hai lần véc tơ pháp tuyến của hai mặt ( pi * p j * p k * ) và ( pi * p k * p j * ) cùng đi
qua ba điểm pi * ; p j * ; p k * (thực chất hai mặt này là một)
nijk   pi* p*j , pi* pk* 



và nikj   pi* pk* , pi* p*j  = - nijk




Do đó đối với thuật toán đang xét chỉ cần kiểm tra mặt mà véc tơ pháp
tuyến có thành phần toạ độ thứ ba âm để thực hiện bước tiếp theo. Giả sử véc
tơ pháp tuyến nijk là véc tơ có thành phần toạ độ thứ ba âm. Để xét xem mặt
( pi * p j * p k * ) có phải là mặt dưới hay không, ta cần kiểm tra xem tất cả các
điểm pm' (m=0,1,2,3,4,5) có nằm phía trên (hoặc thuộc) mặt phẳng đó hay
khơng (dựa vào định nghĩa 1.1.14 và nhận xét 1.1.15)
Điều kiện đó tương đương với đẳng thức: pi* pm* .nijk  0
+) Mặt phẳng ( p0* p1* p2* ) có: p0* p1* (3; 10; 57) ; p0* p2* (0; 8; 64)


17

n012  (184; 192;24); n021  ( 184;192; 24)

- Rõ ràng các điểm: p0* , p1* , p2*  ( p0* p1* p2* )
- Kiểm tra các điểm p3* , p4* ta có:
p0* p3* (3; 7; 60) ; p0* p4* (1; 7; 60)  p0* p3*.n021  648  0 ; p0* p4* .n021  88  0

 ( p0* p1* p2* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p1* p3* ) có: p0* p1* (3; 10; 57) ; p0* p3* (3; 7; 60)
n013  (201; 9; 9); n031  ( 201;9;9)

- Rõ ràng các điểm: p0* , p1* , p3*  ( p0* p1* p3* )
- Kiểm tra các điểm p2* , p4* ta có:
p0* p2* (0; 8; 64) ; p0* p4* (1; 7; 60)  p0* p2* .n013  648  0 ; p0* p4* .n013  804  0

 ( p0* p1* p3* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p1* p4* ) có: p0* p1* (3; 10; 57) ; p0* p4* (1; 7; 60)
n014  (201; 237;31); n041  (201;237; 31)

- Rõ ràng các điểm: p0* , p1* , p4*  ( p0* p1* p4* )
- Kiểm tra các điểm p2* , p3* ta có:
p0* p2* (0; 8; 64) ; p0* p3* (3; 7; 60)  p0* p2* .n041  88  0 ; p0* p3*.n041  804  0

 ( p0* p1* p4* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p2* p3* ) có: p0* p2* (0; 8; 64) ; p0* p3* (3; 7; 60)
n023  (32;192; 24); n032  (32; 192;24)

- Rõ ràng các điểm: p0* , p2* , p3*  ( p0* p2* p3* )

- Kiểm tra các điểm p1* , p4* , p5* ta có:
p0* p1* (3; 10; 57) ; p0* p4* (1; 7; 60)  p0* p1*.n023  648  0 ; p0* p4* .n023  128  0

 ( p0* p2* p3* ) không phải là một mặt dưới.


18
+) Mặt phẳng ( p0* p2* p4* ) có: p0* p2* (0; 8; 64) ; p0* p4* (1; 7; 60)
n024  (32; 64;8); n042  (32;64; 8)

- Rõ ràng các điểm p0* , p2* , p4*  ( p0* p2* p4* )
- Kiểm tra các điểm p1* , p3* ta có:
p0* p1* (3; 10; 57) ; p0* p3* (3; 7; 60)  p0* p1*.n024  88  0 ; p0* p3*.n024  128  0

 ( p0* p2* p4* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p3* p4* ) có: p0* p3* (3; 7; 60) ; p0* p4* (1; 7; 60)
n034  (0; 240;28); n043  (0;240; 28)

- Rõ ràng các điểm: p0* , p3* , p4*  ( p0* p3* p4* )
- Kiểm tra các điểm p1* , p2* ta có:
p0* p1* (3; 10; 57) ; p0* p2* (0; 8; 64)  p0* p1*.n043  804  0 ; p0* p2* .n043  128  0

 ( p0* p3* p4* ) là một mặt dưới.

+) Mặt phẳng ( p1* p2* p3* ) có: p1* p2* (3; 2; 7) ; p1* p3* (0;3; 3)
n123  (15;9;9); n132  (15; 9; 9)

- Rõ ràng các điểm: p1* , p2* , p3*  ( p1* p2* p3* )
- Kiểm tra các điểm p4* , p0* ta có:

p2* p0* (0;8;64) ; p2* p4* (1;1; 4)  p2* p0*.n132  648  0 ; p2* p4* .n132  69  0

 ( p1* p2* p3* ) là một mặt dưới.

+) Mặt phẳng ( p1* p2* p4* ) có: p1* p2* (3; 2; 7) ; p1* p4* (4;3; 3)
n124  (15; 19;1); n142  (15;19; 1)

- Rõ ràng các điểm: p1* , p2* , p4*  ( p1* p2* p4* )
- Kiểm tra các điểm p0* , p3* ta có:
p1* p0* (3;10;57) ; p1* p3* (0;3; 3)  p1* p0*.n142  88  0 ; p1* p3*.n142  60  0


19
 ( p1* p2* p4* ) không phải là một mặt dưới.

+) Mặt phẳng ( p1* p3* p4* ) có: p1* p3* (0;3; 3) ; p1* p4* (4;3; 3)
n134  (0; 12;12); n143  (0;12; 12)

- Rõ ràng các điểm: p1* , p3* , p4*  ( p1* p3* p4* )
- Kiểm tra các điểm p0* , p2* ta có:
p1* p0* (3;10;57) ; p1* p2* (3; 2; 7)  p1* p0* .n143  564  0 ; p1* p3*.n143  108  0

 ( p1* p2* p5* ) không phải là một mặt dưới.

+) Mặt phẳng ( p2* p3* p4* ) có: p2* p3* (3;1; 4) ; p2* p4* (1;1; 4)
n234  (0;16; 4); n243  (0; 16;4)

- Rõ ràng các điểm: p2* , p3* , p4*  ( p2* p3* p4* )
- Kiểm tra các điểm p0* , p1* ta có:
p2* p0* (0;8;64) ; p2* p1* (3; 2;7)  p2* p0*.n234  128  0 ; p2* p1*.n234  60  0


 ( p2* p3* p4* ) là một mặt dưới.

Vậy, phép tam giác phân Delaunay tập các điểm trên gồm 3 tam giác:
D( P)  { p1* p2* p3* ; p2* p3* p4* ; p0* p3* p4*} (xem hình 9)


20

Hình 9
2.1.4. Ví dụ Trong mặt phẳng Oxy, cho tập P gồm 6 điểm.
P = { p0 (1;8), p1 (2; 2), p2 (1;0), p3 (2;1), p4 (2;1), p5 (2;4) }
Dùng thuật toán sử dụng bao lồi dưới trong R3 để tìm D(P)
Giải
p0 (1;8)  p0* (1;8;65)

p3 (2;1)  p3 (2;1;5)

p1 (2;2)  p1 (2;2;8)

p4 (2;1)  p4 (2;1;5)

p2 (1;0)  p2 (1;0;1)

p5 (2;4)  p5 (2;4;20)

*

*


*

*

*

+) Mặt phẳng ( p0* p1* p2* ) có: p0* p1* (3; 10; 57) ; p0* p2* (0; 8; 64)
n012  (184; 192;24); n021  ( 184;192; 24)

- Rõ ràng các điểm: p0* , p1* , p2*  ( p0* p1* p2* )
- Kiểm tra các điểm p3* , p4* , p5* ta có:
p0* p3* (3; 7; 60) ; p0* p4* (1; 7; 60) ; p0* p5* (1; 4; 45)
p0* p3*.n021  648  0 ; p0* p4* .n021  88  0 ; p0* p5*.n021  128  0


21
 ( p0* p1* p2* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p1* p3* ) có: p0* p1* (3; 10; 57) ; p0* p3* (3; 7; 60)
n013  (201; 9; 9); n031  ( 201;9;9)

- Rõ ràng các điểm: p0* , p1* , p3*  ( p0* p1* p3* )
- Kiểm tra các điểm p2* , p4* , p5* ta có:
p0* p2* (0; 8; 64) ; p0* p4* (1; 7; 60) ; p0* p5* (1; 4; 45)
p0* p2* .n013  648  0 ; p0* p4* .n013  804  0 ; p0* p5*.n013  642  0

 ( p0* p1* p3* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p1* p4* ) có: p0* p1* (3; 10; 57) ; p0* p4* (1; 7; 60)
n014  (201; 237;31); n041  (201;237; 31)


- Rõ ràng các điểm: p0* , p1* , p4*  ( p0* p1* p4* )
- Kiểm tra các điểm p2* , p3* , p5* ta có:
p0* p2* (0; 8; 64) ; p0* p3* (3; 7; 60) ; p0* p5* (1; 4; 45)
p0* p2* .n041  88  0 ; p0* p3*.n041  804  0 ; p0* p5*.n041  246  0

 ( p0* p1* p4* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p1* p5* ) có: p0* p1* (3; 10; 57) ; p0* p5* (1; 4; 45)
n015  (230; 190;22); n051  (230;190; 22)

- Rõ ràng các điểm: p0* , p1* , p5*  ( p0* p1* p5* )
- Kiểm tra các điểm p2* , p3* , p4* ta có:
p0* p2* (0; 8; 64) ; p0* p3* (3; 7; 60) ; p0* p4* (1; 7; 60)

p0* p2* .n051  112  0 ; p0* p3*.n051  680  0 ; p0* p4* .n051  240  0

 ( p0* p1* p5* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p2* p3* ) có: p0* p2* (0; 8; 64) ; p0* p3* (3; 7; 60)


22
n023  (32;192; 24); n032  (32; 192;24)

- Rõ ràng các điểm: p0* , p2* , p3*  ( p0* p2* p3* )
- Kiểm tra các điểm p1* , p4* , p5* ta có:
p0* p1* (3; 10; 57) ; p0* p4* (1; 7; 60) ; p0* p5* (1; 4; 45)
p0* p1*.n023  648  0 ; p0* p4* .n023  128  0 ; p0* p5*.n023  344  0


 ( p0* p2* p3* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p2* p4* ) có: p0* p2* (0; 8; 64) ; p0* p4* (1; 7; 60)
n024  (32; 64;8); n042  (32;64; 8)

- Rõ ràng các điểm p0* , p2* , p4*  ( p0* p2* p4* )
- Kiểm tra các điểm p1* , p3* , p5* ta có:
p0* p1* (3; 10; 57) ; p0* p3* (3; 7; 60) ; p0* p5* (1; 4; 45)
p0* p1*.n024  88  0 ; p0* p3*.n024  128  0 ; p0* p5*.n024  72  0

 ( p0* p2* p4* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p2* p5* ) có: p0* p2* (0; 8; 64) ; p0* p5* (1; 4; 45)
n025  (104; 64;8); n052  (104;64; 8)

- Rõ ràng: p0* , p2* , p5*  ( p0* p2* p5* )
- Kiểm tra điểm p1* , p3* , p4* ta có:
p0* p1* (3; 10; 57) ; p0* p3* (3; 7; 60) ; p0* p4* (1; 7; 60)
p0* p1*.n052  128  0 ; p0* p3*.n052  344  0 ; p0* p4* .n052  72  0

 ( p0* p2* p5* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p3* p4* ) có: p0* p3* (3; 7; 60) ; p0* p4* (1; 7; 60)
n034  (0; 240;28); n043  (0;240; 28)

- Rõ ràng các điểm: p0* , p3* , p4*  ( p0* p3* p4* )


23
- Kiểm tra các điểm p1* , p2* , p5* ta có:

p0* p1* (3; 10; 57) ; p0* p2* (0; 8; 64) ; p0* p5* (1; 4; 45)
p0* p1*.n043  804  0 ; p0* p2* .n043  128  0 ; p0* p5*.n043  300  0

 ( p0* p3* p4* ) không phải là một mặt dưới.

+) Mặt phẳng ( p0* p3* p5* ) có: p0* p3* (3; 7; 60) ; p0* p5* (1; 4; 45)
n035  (75; 195;19); n053  (75;195; 19)

- Rõ ràng các điểm: p0* , p3* , p5*  ( p0* p3* p5* )
- Kiểm tra điểm p1* , p2* , p4* ta có:
p0* p1* (3; 10; 57) ; p0* p2* (0; 8; 64) ; p0* p4* (1; 7; 60)
p0* p1*.n053  642  0 ; p0* p2* .n053  344  0 ; p0* p4* .n053  300  0

 ( p0* p3* p5* ) là một mặt dưới.

+) Mặt phẳng ( p1* p2* p3* ) có: p1* p2* (3; 2; 7) ; p1* p3* (0;3; 3)
n123  (15;9;9); n132  (15; 9; 9)

- Rõ ràng các điểm: p1* , p2* , p3*  ( p1* p2* p3* )
- Kiểm tra các điểm p4* , p5* , p0* ta có:
p2* p0* (0;8;64) ; p2* p4* (1;1; 4) ; p2* p5* (1; 4;19)
p2* p0*.n132  648  0 ; p2* p4* .n132  69  0 ; p2* p5*.n132  231  0

 ( p1* p2* p3* ) là một mặt dưới.

+) Mặt phẳng ( p1* p2* p4* ) có: p1* p2* (3; 2; 7) ; p1* p4* (4;3; 3)
n124  (15; 19;1); n142  (15;19; 1)

- Rõ ràng các điểm: p1* , p2* , p4*  ( p1* p2* p4* )
- Kiểm tra các điểm p0* , p3* , p5* ta có:

p1* p0* (3;10;57) ; p1* p3* (0;3; 3) ; p1* p5* (4;6;12)


×