Bài toán "Tìm đường đi ngắn nhất giữa hai điểm trong một đagiác đơn"với khoảng cách theo chuẩn Euclidean trong mặt phẳng đã được nhiều nhà toán học đưa ra các thuật toán khác nhau để giả
Trang 1Mục lục
1.1 Lý thuyết đồ thị 6
1.1.1 Định nghĩa đồ thị 6
1.1.2 Đường đi trong đồ thị 8
1.1.3 Một số tính chất về đường đi trong đồ thị 9
1.2 Tam giác phân đa giác 10
1.2.1 Đường gấp khúc đơn điệu và đa giác đơn điệu 10 1.2.2 Các tính chất 12
1.3 Độ phức tạp thuật toán 15
1.3.1 Khái niệm độ phức tạp của thuật toán 15
1.3.2 Các định nghĩa 16
1.3.3 Các tính chất 17
1.3.4 Cách tính độ phức tạp của thuật toán 19
1.3.5 Phép tính cơ sở 19
1.3.6 Dãy các phép tính 19
1.4 Thuật toán tìm tiếp tuyến của O’Rourke 22
2 Thuật toán Dijkstra và thuật toán tam giác phân 24 2.1 Thuật toán Dijstra 24
2.1.1 Thuật toán Dijkstra 24
2.1.2 Chứng minh tính đúng đắn của thuật toán 27
2.1.3 Độ phức tạp thuật toán Dijkstra 27
1
Trang 22.2 Thuật toán tam giác phân đa giác đơn 30
2.2.1 Phân chia đa giác đơn thành các đa giác đơn điệu 31 2.2.2 Thuật toán tam giác phân đa giác đơn điệu 31
2.2.3 Thuật toán tam giác phân đa giác đơn 36
3 Thuật toán tìm đường đi ngắn nhất giữa hai điểm 37 3.1 Thuật toán của Lee và Preparata 37
3.1.1 Các định nghĩa 37
3.1.2 Các tính chất 40
3.1.3 Thuật toán tạo ra hình ống tay (sleeve) 40
3.1.4 Độ phức tạp của thuật toán SLEEVE(P) 41
3.1.5 Thuật toán Phễu (Funnel) của Lee và Preparata 42 3.1.6 Chứng minh tính đúng đắn của thuật toán 43
3.1.7 Độ phức tạp thuật toán Phễu 44
3.2 Thuật toán tìm đường đi ngắn nhất 47
3.2.1 Thuật toán thuật toán chính 48
3.2.2 Độ phức tạp thuật toán 48
3.2.3 Chứng minh tính đúng đắn của thuật toán 48
Trang 3Danh sách hình vẽ
1.1 Đồ thị hữu hạn 7
1.2 Minh hoạ điểm nằm bên trái, bên phải đường thẳng 11
1.3 Minh hoạ đa giác 12
1.4 Minh hoạ sự tồn tại đỉnh lồi 13
1.5 Minh hoạ tính chất đường chéo 13
1.6 Minh hoạ đường gấp khúc đơn điệu và đa giác đơn điệu. 15 1.7 Mô tả quan hệ giữa hai hàm cg(n) và f (n) . 16
1.8 Minh hoạ thuật toán tìm tiếp tuyến 23
2.1 Mô tả đồ thị có trọng số 28
2.2 Quá trình tìm đường đi ngắn nhất theo thuật toán 29
2.3 Minh hoạ đa giác Y - đơn điệu 33
2.4 Minh hoạ quá trình tam giác hoá đa giác Y- đơn điệu 35 3.1 Minh hoạ cây đối ngẫu 38
3.2 Minh hoạ hình ống tay (Sleeve) 38
3.3 Minh hoạ Phễu (Funnel) 39
3.4 Minh hoạ hai trường hợp xác định Phễu mới 39
3.5 Minh hoạ tính chất đường ống tay 40
3.6 Minh hoạ tính chất của Phễu 41
3.7 Minh hoạ hình ống tay(Sleeve) 44
3.8 Quá trình tìm đường đi ngắn nhất theo thuật toán Phễu 47
3.9 Minh họa quá trình tìm đường đi ngắn nhất từ a đến b. 51
3
Trang 4Mở đầu
Hình học tính toán là lĩnh vực nghiên cứu để tìm ra các thuật toánhiệu quả và thực thi trên máy tính cho những bài toán hình học Tronghình học tính toán thường giải quyết các bài toán kinh tế, như: Tìmđịa điểm để đặt các nhà máy, đặt trạm điện, đặt bến xe, tìm đường
đi ngắn nhất cho những chiếc tàu biển,
Tìm đường đi ngắn nhất giữa hai điểm trong một miền hình học làmột trong những vấn đề cơ bản trong hình học tính toán Điều này cónhiều ứng dụng trong kỹ thuật rôbốt, kỹ thuật tự động, công nghiệp,thông tin địa lý Thực tế đó đã thu hút rất nhiều nhà toán họcquan tâm nghiên cứu như: O’Rourke, Dijkstra, Preparata, Lee, Berg,Kreveld, Guibas, Hershberger, Leven
Bài toán "Tìm đường đi ngắn nhất giữa hai điểm trong một đagiác đơn"(với khoảng cách theo chuẩn Euclidean) trong mặt phẳng
đã được nhiều nhà toán học đưa ra các thuật toán khác nhau để giảiquyết Năm 1984, Lee và Preparata đã đưa ra thuật toán cơ bản đểgiải quyết bài toán này thông qua việc tam giác phân đa giác (xem[13]) và năm 1987, Guibas, Hershberger, Leven, Sharir và Tarjan đã
có sự cải tiến thuật toán này (xem [12])
Trong luận văn này chúng tôi nghiên cứu về thuật toán của Lee vàPreparata (đã có sự cải tiến) để giải bài toán trên Với lý do đó chúng
tôi chọn đề tài của luận văn là:"Về thuật toán tìm đường đi ngắn nhất
giữa hai điểm trong một đa giác đơn của Lee và Preparata".
Luận văn được trình bày trong ba chương:
Trang 5Chương 1 Kiến thức cơ sở
Với quan điểm là chương cơ sở, trong chương này chúng tôi trình bày
hệ thống kiến thức về lý thuyết đồ thị, tam giác phân đa giác, độ phứctạp của thuật toán, thuật toán tìm tiếp tuyến của O’Rourke nhằm giúplàm cơ sở cho việc nghiên cứu thuật toán của Lee và Preparata.Chương 2 Thuật toán Dijkstra và thuật toán tam giác phân
đa giác
Trong chương này chúng tôi trình bày thuật toán của Dijkstra, thuật
toán phân chia đa giác đơn thành các đa giác y - đơn điệu, thuật toán tam giác phân đa giác y - đơn điệu, thuật toán tam giác phân đa giác
Luận văn được hoàn thành dưới sự hướng dẫn tận tình của thầygiáo TS Phan Thành An Tác giả xin được bày tỏ lòng biết ơn sâusắc tới thầy và xin chân thành cảm ơn các thầy giáo trực tiếp giảngdạy chuyên ngành với những ý kiến đóng góp trong học tập và làmluận văn
Cũng nhân dịp này tác giả xin gửi lời cảm ơn các thầy cô giáo trongkhoa Toán và khoa Đào tạo sau đại học, anh Lê Đình Hậu cao học
13 Hình học - Tôpô, bạn Dương Quốc Nam, các bạn học viên lớp caohọc 14 Hình học - Tôpô, cán bộ giáo viên trường THPT Anh Sơn 3,gia đình và bạn bè đã động viên, giúp đỡ tôi trong quá trình học tậpnghiên cứu trong suốt khóa học
Trang 6Chương 1
Kiến thức cơ sở
Trong chương này chúng tôi trình bày một số kiến thức về lý thuyết
đồ thị, đa giác đơn điệu, phép tam giác phân đa giác, độ phức tạpthuật toán và thuật toán tìm tiếp tuyến của O’Rourke Đây là nhữngkiến thức cơ sở cho chương 2 và chương 3
1.1 Lý thuyết đồ thị
1.1.1 Định nghĩa đồ thị
Chúng ta nhìn thấy hoặc sử dụng bản đồ các tuyến đường giaothông của một thành phố, sơ đồ tổ chức một cơ quan, sơ đồ khối tínhtoán của một thuật toán, sơ đồ một mạng máy tính Đó là những
ví dụ cụ thể về đồ thị Đồ thị (graph) là một mô hình toán học được
ứng dụng trong nhiều lĩnh vực khoa học, kỹ thuật và được định nghĩanhư sau
Định nghĩa 1.1.1 (xem [5]) Đồ thị là một cặp G = (V, E) trong đó:
Trang 7và cả hai đỉnh a và b kề với cạnh (a, b).
Trong đồ thị ở ví dụ 1.1.1 hai đỉnh b và c kề với đỉnh a, ba đỉnh a, b
và d kề với đỉnh e Do vậy, ta có thể định nghĩa đồ thị bằng ánh xạ
Cặp đỉnh (x, y) ∈ E không sắp thứ tự được gọi là cạnh vô hướng, còn nó có sắp thứ tự thì được gọi là cạnh có hướng Vì thế, chúng ta
thường phân các đồ thị thành hai lớp
Định nghĩa 1.1.3 (xem [5]) Đồ thị chỉ chứa các cạnh vô hướng được
gọi là đồ thị vô hướng, còn đồ thị chỉ chứa các cạnh có hướng gọi là
Trang 8đồ thị có hướng.
Hiển nhiên, mỗi đồ thị vô hướng có thể biểu thị bằng một đồ thị cóhướng bằng cách thay mỗi cạnh vô hướng bằng hai cạnh có hướngtương ứng
Định nghĩa 1.1.4 (xem [5]) Đồ thị G = (V, E) được gọi là đối xứng
nếu:
∀x, y ∈ V : (x, y) ∈ E ⇔ (y, x) ∈ E.
Các đồ thị vô hướng là đối xứng.
Định nghĩa 1.1.5 (xem [5]) Đồ thị G = (V, E) mà mỗi cặp đỉnh được
nối nhau bởi không quá một cạnh được gọi là đơn đồ thị (thường gọi tắt là đồ thị) còn nếu đồ thị có những cặp đỉnh được nối với nhau nhiều hơn một cạnh thì được gọi là đa đồ thị.
Ta biễu diễn hình học cho đồ thị như sau: Trên mặt phẳng biễu diễnđỉnh bằng các vòng tròn nhỏ, biểu diễn cạnh vô hướng bằng đoạnthẳng, biểu diễn cạnh có hướng bằng mũi tên nối hai đỉnh của đồ thị
Trang 9hx1, x2, , x i , x i+1 , , x k−1 , x k i.
sao cho mỗi đỉnh trong dãy (không kể đỉnh đầu tiên) kề với đỉnh trước
nó bằng một cạnh nào đó, nghĩa là:
∀i = 2, 3, , k − 1, k : (x i−1 , x i ) ∈ E
Ta nói rằng đường đi này đi từ đỉnh đầu x i đến đỉnh cuối x k Số cạnh
của đường đi được gọi là độ dài của đường đi đó
Đường đi đơn là đường đi mà các đỉnh trên nó khác nhau từng đôimột
Trong một đồ thị, đỉnh nút là đỉnh kề với chính nó Hai cạnh có ít
nhất một đỉnh chung được gọi là hai cạnh kề nhau
Định nghĩa 1.1.9 (xem [5]) Đồ thị G được gọi là đồ thị có trọng
số nếu mỗi cạnh (i, j) của đồ thị được gán một số nguyên không âm
C(i, j).
• Nhãn C(i, j) trên cạnh (i, j) của đồ thị thường biễu diễn "chi phí"
thực tế đi qua cạnh này
1.1.3 Một số tính chất về đường đi trong đồ thị
Định lý 1.1.1 (xem [5]) Giả sử đồ thị G có n đỉnh Tồn tại đường đi
từ đỉnh a đến đỉnh b trên đồ thị G khi và chỉ khi tồn tại một đường đi
từ a đến b trên đồ thị này với độ dài không vượt quá n − 1.
Chứng minh Giả sử có đường đi từ đỉnh a tới đỉnh b Ta có thể chọn:
Trang 10< a = x1, x2, , x k = b, trong đó x1 = x k >
là đường đi có độ dài ngắn nhất
Độ dài của đướng đi là k − 1 Nếu k − 1 ≤ n − 1 thì định lý được
cũng là đường đi từ a đến b nhưng với độ dài ngắn hơn Suy ra mâu
thuẫn với giả thiết của đường đi ngắn nhất ¤
Định lý 1.1.2 (xem [5]) Tổng tất cả các bậc của các đỉnh trong một
đồ thị bằng hai lần số cạnh của đồ thị đó.
Chứng minh Ta tính bậc của các đỉnh Mỗi đỉnh thuộc một cạnh
nào đó thì bậc của nó tăng thêm 1, mà mỗi cạnh thì có hai đỉnh
2
1.2 Tam giác phân đa giác
1.2.1 Đường gấp khúc đơn điệu và đa giác đơn điệu
Trước hết ta quy ước đường thẳng ab là đường thẳng đi qua hai điểm phân biệt a và b theo hướng − → ab.
Định nghĩa 1.2.1 (xem [14]) Trong mặt phẳng R2, cho 3 điểm a(x1; y1);
b(x2; y2); c(x3; y3).
Ký hiệu S(a, b, c) là diện tích đại số của 4abc, khi đó :
S(a, b, c) = (x2 − x1)(y3 − y1) − (x3 − x1)(y2 − y1)
2
Trang 11= 12
b
c nằm bên phải đường thẳng ab
Hình 1.2: Minh hoạ điểm nằm bên trái, bên phải đường thẳng
Định nghĩa 1.2.2 (xem [14]) Đa giác là một miền mặt phẳng được
giới hạn bởi một đường gấp khúc khép kín những đoạn thẳng trong mặt phẳng Những đoạn thẳng gọi là cạnh của đa giác và những điểm chung của hai đầu đoạn thẳng gọi là đỉnh Một đa giác gọi là đa giác đơn nếu các cạnh của nó không giao nhau, nghĩa là hai cạnh kề của
nó chỉ có một điểm chung là đỉnh
Trong luận văn này chúng tôi chỉ xét những đa giác mà không có bất
kỳ ba đỉnh nào thẳng hàng
• Một đỉnh của đa giác P được gọi là đỉnh phản xạ (reflex) nếu góc
bên trong của nó lớn hơn Π
• Một đỉnh của đa giác P được gọi là đỉnh lồi (convex vertex) nếu
góc bên trong của nó nhỏ hơn Π
Định nghĩa 1.2.3 (xem [13]) Một đường gấp khúc đa giác q1q2 q k
là một dãy của những điểm q i (i = 1, k) trong mọi cặp nào những điểm
Trang 12kề q i và q i+1 biểu thị một đoạn với i = 1, k − 1 và không có hai đoạn nào không liên tiếp cắt nhau.
Hình 1.3: Minh hoạ đa giác Một đa giác đơn chia mặt phẳng ra thành phần trong, biên và phần
ngoài Giả sử đa giác P = v0, v1, , v n−1 Hai đỉnh không kề nhau vi
và v i−1 với i<j thì đoạn thẳng v i v i−1 là đường chéo (nếu đa giác đơn
thì đòi hỏi thêm, đoạn nối hai đỉnh này phải hoàn toàn nằm trongmiền trong của đa giác đơn)
Tam giác phân một đa giác là dùng những đường chéo không giaonhau của đa giác để chia phần trong của đa giác thành các tam giác
Định nghĩa 1.2.4 Cho đa giác đơn gồm n+1 đỉnh < p0, p1, , p n > Khi đó, ta nói thứ tự các đỉnh p i (i = 0, n) của đa giác sắp thứ tự ngược chiều kim đồng hồ nếu và chỉ nếu tiếp giáp với phần bên trái cạnh p i p i+1 , ∀i = 0, n − 1 là phần trong đa giác.
Trong trường hợp ngược lại, ta nói các đỉnh p i của đa giác sắp xếp theo thứ tự cùng chiều kim đồng hồ.
1.2.2 Các tính chất
Bổ đề 1.2.1 (xem [14])
Mọi đa giác đều có ít nhất một đỉnh lồi
Chứng minh Giả sử cho đa giác P có các đỉnh sắp thứ tự ngược chiều
kim đồng hồ, L là đường thẳng đi qua một đỉnh v có tung độ thấp nhất
Trang 13L v
Hình 1.4: Minh hoạ sự tồn tại đỉnh lồi
của P Nếu có hai đỉnh có cùng tung độ thấp nhất, xét đỉnh v nằm về phía bên phải Khi đó phần trong của P phải nằm về phía trên đường thẳng L do đó cạnh đi sau v cũng phải nằm phía trên L do đó góc trong
Bổ đề 1.2.2 (xem [14]) Mọi đa giác n đỉnh, n ≥ 4 có ít nhất một
đường chéo.
Định lý 1.2.1 (xem [14]) Mọi đa giác P n đỉnh có thể phân chia
thành các tam giác bằng việc thêm các đường chéo (có thể bằng không)
b
a d
Hình 1.5: Minh hoạ tính chất đường chéo
Chứng minh (minh họa hình 1.5) Ta chứng minh bằng quy nạp:
- Nếu n = 3 thì đa giác là một tam giác (hiển nhiên đúng)
- Nếu n ≥ 4, giả sử d = ab là một đường chéo của P (tồn tại do bổ đề
1.2.2) Vì theo định nghĩa d chỉ cắt biên P tại những điểm cuối, nó
Trang 14phân chia P thành hai đa giác, mỗi đa giác đó nhận d làm một cạnh,
rõ ràng hai đa giác ít hơn n đỉnh và mỗi đa giác ngoài hai đỉnh a, b có
ít nhất một đỉnh khác nữa Do đó áp dụng giả thiết quy nạp cho hai
Mệnh đề 1.2.1 (xem [14]) Mọi phép tam giác phân đa giác n đỉnh
cần sử dụng n − 3 đường chéo trong và chứa n − 2 tam giác.
Chứng minh Ta chứng minh bằng quy nạp:
Định nghĩa 1.2.5 (xem [14], trang 45)
• Đường gấp khúc C là đường gấp khúc đơn điệu nếu tồn tại một đườg thẳng L sao cho mọi đường thẳng vuông góc với L thì hoặc
nó không cắt C, hoặc cắt C tại một điểm, hoặc cắt C theo một đoạn thẳng Và khi đó ta cũng nói đường gấp khúc C là đơn điệu theo phương L.
• Một đa giác được gọi là đơn điệu nếu nó là đa giác đơn và biên
Trang 15của nó hợp thành từ hai đường gấp khúc đơn điệu cùng theo một phương.
Hình 1.6: Minh hoạ đường gấp khúc đơn điệu và đa giác đơn điệu.
Định nghĩa 1.2.6 (xem [14]) Một đa giác đơn P được gọi là y - đơn điệu nếu nó đơn điệu đối với trục oy.
Định nghĩa 1.2.7 (xem [14], trang 46) Một đỉnh v của một đa giác
đơn được gọi là đỉnh lùi phía trong (interior cusp) nếu góc bên trong tại v lớn hơn Π và hai đỉnh kề bên nó có tung độ lớn hơn hoặc nhỏ hơn tung độ của v.
Mệnh đề 1.2.2 (xem [14], trang 46) Nếu P là một đa giác đơn không
có điểm lùi trong, thì P là một y-đơn điệu.
1.3 Độ phức tạp thuật toán
1.3.1 Khái niệm độ phức tạp của thuật toán
(xem [2]) Độ phức tạp của thuật toán là những thước đo để so sánhtính hiệu quả của thuật toán Một thước đo hiệu quả đó là thời gianmáy tính sử dụng để giải bài toán theo thuật toán đang xét, khi cácgiá trị đầu vào có một kích thước xác định Một thước đo thứ hai đó
là bộ nhớ đòi hỏi thực hiện thuật toán đó khi giá trị đầu vào có kích
thước cho trước Gắn liền với thời gian tính toán của thuật toán là độ
phức tạp thời gian và bộ nhớ là độ phức tạp không gian Biết được độ
Trang 16phức tạp thời gian cho một thuật toán rất quan trọng, vì khi đó tabiết được thời gian là một phút, một năm, một tỉ năm để thực hiệnthuật toán đó Độ phức tạp không gian đòi hỏi của thuật toán mà tabiết được thì cho ta một bước chuẩn bị và thấy được khả năng đápứng trong việc tính toán của thuật toán.
Độ phức tạp không gian gắn liền với cấu trúc dữ liệu đặc biệt dùng
để tính toán trong thật toán Trong đề tài này chúng tôi không nghiêncứu về cơ sở dữ liệu nên ta bỏ qua độ phức tạp không gian
Để tính toán độ 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à hầu như dương làm
công cụ đo Nghĩa là tồn tại một số nguyên dương n0 sao cho f (n) > 0 với mọi n > n0 Kí hiệu F là tập hợp tất cả các hàm như vậy.
1.3.2 Các định nghĩa
(xem [2]) Cho hàm số g(n) ∈ F, ta định nghĩa O¡g(n)¢ là một
tập hợp tất cả các hàm f (n) ∈ F có tính chất: Tồn tại hằng số c và
n0 sao cho với mọi n > n0 thì f (n) 6 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), ( xem hình vẽ 1.7) Những
hàm thuộc O thường dùng như chặn dưới của hàm thực hiện tính
toán trong thuật toán để giải một bài toán Người ta dùng kí hiệu
cg(n)
f (n) y
Hình 1.7: Mô tả quan hệ giữa hai hàm cg(n) và f (n).
Trang 17f (n) ≤ c2.g(n).
Định nghĩa 1.3.2 (xem [2]) Cho hàm số g(n) ∈ F, ta định nghĩa
Ω¡g(n)¢ là tập hợp tất cả các hàm f (n) ∈ F có tính chất: Tồn tại hằng số dương c và n0 sao cho với mọi n > n0 thì c.g(n) ≤ f (n) Nếu f (n) ∈ Ω¡g(n)¢, thì ta nói f (n) là Ô mê ga lớn của g(n).
1.3.3 Các tính chất
Mệnh đề 1.3.1 (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) ≤ c1.g1(n) và với mọi
n ≥ n2, f2(n) ≤ c2.g2(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) ≤ c1.g1(n)+c2.g2(n) ≤ c0.(g1(n)+g2(n)). ¤
Mệnh đề 1.3.2 (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)}¢.
Trang 18Chứng minh Giả sử rằng với mọi n ≥ n1, f1(n) ≤ c1.g1(n) và với mọi
n ≥ n2, f2(n) ≤ c2.g2(n).
Ta đặt n0 = max{n1, n2} và c0 = c1.c2 Khi đó với mọi n > n0 ta có
f1(n).f2(n) ≤ c1.g1(n).c2.g2(n) ≤ c0.(g1(n).g2(n)). ¤
Mệnh đề 1.3.4 (xem [2]) Cho P (n) = a k n k +a k−1 n k−1 + +a1n+a0
là đa thức bậc k, a k > 0 Khi đó P (n) ∈ O(n k ).
Chứng minh Do ta có: P (n) = a k n k + a k−1 n k−1 + + a1n + a0
≤ a k n k + | a k−1 | n k−1 + + | a1 | n+ | a0 |
≤ | a k | n k + | ak | n k + + | a1 | n k + | a0 | n k
= (| a k | + | a k−1 | + + | a1 | + | a0 |)n k Nếu c =| a k | + | a k−1 | + + | a1 | + | a0 |, thì P (n) ≤ c.n k với mọi
Trang 191.3.4 Cách tính độ phức tạp của thuật toán
Độ phức tạp tính toán được đo bằng hàm O( ) là chính Vì vậy để
tính độ phức tạp tính toán của thuật toán tức là ta đi xác định hàm
T (n) ∈ O(g(n)) cho đoạn mã chương trình đó, n là biến số của phép
toán cơ sở
Các phép toán được dùng để đo độ phức tạp thời gian có thể làphép so sánh các số nguyên, phép cộng, phép trừ, nhân, chia các sốnguyên hoặc bất kì một phép toán sơ cấp nào khác
1.3.5 Phép tính cơ sở
(Xem[2]) Độ phức tạp của toán tử cơ sở là một hằng số, nghĩa là
O(1) Toán tử cơ sở là gì không phải dễ xác định, với nhũng bắt buộc
khác nhau cho ta định nghĩa lại phép toán cơ sở Theo nguyên tắc,phép toán cơ sở là phép toán thực hiện một hằng số thời gian, phụthuộc vào dung lượng thao tác trên thông tin Thường thường phéptính cơ sở là các phép tính cộng, trừ, nhân, chia Nhưng chú ý rằngkhi ta thực hiện số lớn hàng tỉ thì không thể chấp nhận phép nhâncác số lớn là một phép tính cơ sở Cũng không thể nhận phép tính cơ
sở là các hàm lượng giác, hàm số mũ, hàm số lôgarit, bởi vì chúngtính toán theo dãy
1.3.6 Dãy các phép tính
(Xem[2]) Độ phức tạp thời gian của dãy liên tiếp các phép tính xácđịnh bởi độ phức tạp cao nhất trong chúng
Tức là, giả sử toán tử s1 có độ phức tạp F1, 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 toán ta kết hợp những kí hiệu
độ đo phức và phân tích trong trường hợp xấu nhất để biết được
Trang 20thời gian thực hiện những thuật toán trong thời gian xấu nhất là baonhiêu? Người ta định ra độ phức tạp của các phép toán trong trườnghợp xấu nhất là:
1 Phép gán có độ phức tạp O(1).
2 Phép nhập vào thủ tục có độ phức tạp O(1).
3 Phép ra khỏi thủ tục có độ phức tạp O(1).
4 Mệnh đề if<điều kiện> độ phức tạp là thời gian so sánh
cộng với O(max của hai nhánh).
5 Vòng (While) có độ phức tạp là tổng tất cả các vòng lặp vớithời gian của mỗi vòng lặp đó
Ta phân tích đoạn chương trình trên Dòng số 1 và 2 cố định mất thời
gian hằng số, ta kí hiệu là a Cho ta phép tính toán ở dòng 3 gồm
i := 1, kiểm tra i < n và i := i + 1 cũng chiếm thời gian hằng số, ta
kí hiệu lần lượt là b, c, d Tương tự ở dòng 4 thời gian cho các phép toán j := 1; j < n và j := j + 1 cũng chiếm thời gian hằng số, ta kí hiệu lần lượt là e, f, g Cuối cùng phép toán ở dòng 5 đòi hỏi thời gian hằng số là h.
Với những đại lượng ở trên thì không khó tính được thời gian chung
cho thực hiện đoạn chương trình với giá trị bất kì n nào đó:
T (n) = a + b + nc + nd + n(e + nf + ng + nh)
Trang 21= a + b + nc + nd + ne + n2f + n2g + n2h
= n2(f + g + h) + n(c + d + e) + a + b Bởi vì a, b, c, e, g, f, h là những hằng số, ta đặt:
i = f + g + g, j = c + d + e, k = a + b
Khi đó thuật toán thực hiện mất thời gian là
T (n) = i.n2 + j.n + k Vậy T (n) = O(n2)
Ví dụ 1.3.2 độ phức tạp của vòng for của đoạn chương trình sau
Dòng 1: phép tính cố định mất thời gian hằng số, kí hiệu là a.
Dòng 2: Với phép toán gán i := 1, kiểm tra i < n và i := i + 1 cũng chiếm thời gian hằng số, ta kí hiệu lần lượt là b, c, d.
Dòng 3: Cũng đòi hỏi thời gian hằng số, kí hiệu là e.
Khi đó, thời gian (độ phức tạp) để thực hiện chương trình là:
T (n) = a + b + n(c + d) + n(e) = n(c + d + e) + a + b
Suy ra T (n) = O(n).
Ví dụ 1.3.3 Tìm độ phức tạp của cấu trúc if(p) then s1; else s2
(xem [2])
Nếu độ phức tạp của p, s1, s2 tương ứng là O(P ), O(F1), O(F2) thì độ
phức tạp của cấu trúc if là max{O(P ), O(F1), O(F2)}, nghĩa là độ phức tạp tăng nhanh nhất của hàm P, F1, F2
T (P ) ∈ O(P ); T (s1) ∈ O(F1); T (s2) ∈ O(F2).
Trang 22Suy ra T (if(p) then s1 else s2) ∈ max{O(P ), O(F1), O(F2)}.
Ta có thể giải thích như sau:
- Giả sử điều kiện p đúng thì dãy lệnh p, s1 được thực hiện có độ phức
tạp là max{O(P ), O(F1)}.
- Giả sử điều kiện p sai thì dãy lệnh p, s2 được thực hiện có độ phức
tạp là max{O(P ), O(F2)}.
Mà ta chưa biết trong hai khối lệnh thì khối nào thực hiện trước Do
đó, ta nhận được độ phức tạp cho toàn vòng if là
T (if(p) then s1 else s2) ∈ max{max{O(P ), O(F1)}; max{O(P ), O(F2)}}
= max{O(P ), O(F1), O(F2)}.
1.4 Thuật toán tìm tiếp tuyến của O’Rourke
Bài toán: Trong mặt phẳng cho đa giác lồi P có n đỉnh, giả sử số
đỉnh là {p0, p1, , p n−1 } được đánh số theo thứ tự ngược chiều kim đồng
hồ và p là một điểm nằm ngoài P Hãy tìm thuật toán xác định đường thẳng tiếp tuyến từ p tới P.
Mô tả thuật toán(xem [14])
Để tìm hai tiếp tuyến ta bắt đầu với việc tìm hai tiếp điểm Việctìm hai tiếp điểm được thực hiện như sau:
Giả sử tại điểm thứ p i nếu điểm p nằm bên trái của p i−1 p i và p nằm bên phải của p i p i+1 thì p i là tiếp điểm của tiếp tuyến trái Giả sử tại điểm thứ p j nếu điểm p nằm bên phải của p i−1 p i và p nằm bên trái của p j p j+1 thì p j là tiếp điểm của tiếp tuyến phải kẻ được từ điểm p tới P Để đơn giản hơn trong việc đưa ra thuật toán ta có thể cải tiến
thuật toán như sau:
Tìm điểm pi sao cho hai điểm pi−1 , p i+1 đều nằm bên phải ppi thì
pp i là tiếp tuyến bên trái của P Ngược lại, nếu có điểm p i sao cho hai
Trang 23left
right
left
Hình 1.8: Minh hoạ thuật toán tìm tiếp tuyến
điểm p i−1 , p i+1 đều nằm bên trái pp i thì pp i là tiếp tuyến bên phải của
P.
Thuật toán 1.4.1
for i = 1 to n do
if p i−1 , p i+1 nằm bên phải pp i then
pp i là tiếp tuyến bên trái end if,
if p i−1 , p i+1 nằm bên trái pp i then
pp i là tiếp tuyến bên phải end if,end for
Độ phức tạp của thuật toán
Do thuật toán trên sử dụng vòng for nên có độ phức tạp là tuyến
tính O(n) (theo cách xác định độ phức tạp của vòng for ở ví dụ1.3.2)
Trang 24Chương 2
Thuật toán Dijkstra và thuật toán tam giác phân đa giác
Trong chương này chúng tôi trình bày các thuật toán: thuật toán
Dijkstra, thuật toán phân chia đa giác thành các đa giác y - đơn điệu, thuật toán tam giác phân đa giác y - đơn điệu, thuật toán tam giác
phân đa giác đơn và xem như là những chương trình con của thuậttoán chính về tìm đường đi ngắn nhất giữa hai điểm trong một đa giácđơn ở chương 3
2.1 Thuật toán Dijstra
Bài toán 2.1.1 Cho đồ thị có trọng số G = (V, E) và hai đỉnh a, b ∈
G Hãy tìm đường đi có trọng số bé nhất (nếu có) đi từ đỉnh a đến đỉnh b.
2.1.1 Thuật toán Dijkstra
Năm 1959 Dijkstra đưa ra một thuật toán rất hiệu quả giải bài toánđường đi ngắn nhất giữa hai đỉnh trong đồ thị Thuật toán thực hiện
việc gán và giảm giá trị nhãn d(i) tại mỗi đỉnh i của đồ thị G Thuật
toán được mô tả như sau:
1 Với đỉnh xuất phát a, gán nhãn d(a) := 0.
24
Trang 252 Nếu có cạnh (i, j) mà đỉnh i đã được gán nhãn và đỉnh j chưa được gán nhãn hoặc đỉnh j đã được gán nhãn nhưng d(i)+l(i, j) < d(j) thì giảm nhãn d(j) := d(i) + l(i, j).
3 Lặp lại bước 2 cho đến khi không gán hoặc giảm nhãn được nữa
Định lý 2.1.1 (xem [4]) Tại mỗi đỉnh b giá trị gán nhãn d(b) cuối
cùng (nếu có) chính là độ dài của đường đi ngắn nhất từ đỉnh a đến đỉnh b.
Chứng minh Sau khi thực hiện xong thuật toán trên, nếu giá trị nhãn d(b) xác định thì ta có đường đi từ đỉnh a đến đỉnh b.
Ta khôi phục đường đi từ a đến b như sau:
Xuất phát từ đỉnh b, tìm cạnh có đỉnh cuối là b và đỉnh đầu là i sao
d(a) + l(a, a1) = d(a1)
d(a1) + l(a1, a2) = d(a2)
d(a a k−1 ) + l(a k−1 , b) = d(b)
Cộng từng vế và khử các giá trị chung ở cả hai vế ta có:
l(a, a1) + l(a1, a2) + + l(ak−1 , b) = d(b)
Vậy giá trị nhãn d(b) chính là độ dài đường đi nói trên.
Bất kỳ đường đi nào khác từ đỉnh a đến đỉnh b cũng có các hệ thức
Trang 26tương tự nhưng có dấu ≥ Vậy nhãn d(b) là độ dài của đường đi ngắn
Thuật toán 2.1.1 (DIJKSTRA(G, a, b)) (xem [4])
Input: Đồ thị có trọng số không âm G = (V, E) với n đỉnh,
Trang 272.1.2 Chứng minh tính đúng đắn của thuật toán Dijkstra
-Thuật toán sẽ dừng sau hữu hạn bước lặp bởi vì đồ thị đã cho là
hữu hạn đỉnh và thuật toán kết thúc khi đỉnh b có nhãn cố định.
-Ta cần chứng minh thuật toán kết thúc thì cho ta đường đi ngắn nhất
từ a đến b Thật vậy:
Giả sử ở một bước lặp nào đó các nhãn cố định, khi đó ở lần lặp tiếp
theo nếu đỉnh u∗ thu được nhãn cố định d(u∗) chính là độ dài đường
đi ngắn nhất từ a đến u∗ (theo định lý 2.1.1)
Ký hiệu S1 là tập hợp các đỉnh có nhãn cố định ở bước lặp đang
xét Do ở lần lặp đầu tiên S1 = {a} và sau mỗi lần lặp ta chỉ thêm vào một đỉnh u∗ nên giả thiết là d(v) cho độ dài đường đi ngắn nhất
từ a đến v với mọi v ∈ S1 là đúng với bước lặp đầu tiên Khi b ∈ S1thì d(b) là độ dài đường đi ngắn nhất từ a đến b 2
2.1.3 Độ phức tạp thuật toán Dijkstra
- Mỗi bước lặp để tìm ra đỉnh u có độ phức tạp là O(n).
- Việc gán lại nhãn có độ phức tạp là O(n).
Thuật toán thực hiện n − 1 bước lặp vì vậy độ phức tạp của thuật toán là O(n2)
Ví dụ 2.1.1 Xét đồ thị có trọng số G = (V, E) với
V = {a, b, c, d, e, g, h, i, k, z} như hình vẽ 2.1 Hãy xác định đường đi ngắn nhất từ a đến z.
Mô tả thuật toán qua ví dụ:
Bước 1 (minh hoạ bởi hình 2.2 (H1))