LỜI CAM ĐOAN Tôi xin cam đoan: Những kết quả nghiên cứu được trình bày trong luận văn: “Thuật toán hình phễu tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn” là hoàn toàn trung t
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC VINH
_
NGUYỄN TUẤN ANH
THUẬT TOÁN HÌNH PHỄU TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA HAI ĐIỂM TRONG ĐA GIÁC ĐƠN
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
NGHỆ AN, 2017
Trang 2BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC VINH
_
NGUYỄN TUẤN ANH
THUẬT TOÁN HÌNH PHỄU TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA HAI ĐIỂM TRONG ĐA GIÁC ĐƠN
Chuyên ngành: CÔNG NGHỆ THÔNG TIN
Mã số: 60.48.02.01
LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN
Người hướng dẫn khoa học: TS LÊ HỒNG TRANG
NGHỆ AN, 2017
Trang 3LỜI CAM ĐOAN
Tôi xin cam đoan:
Những kết quả nghiên cứu được trình bày trong luận văn: “Thuật toán hình phễu tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn” là
hoàn toàn trung thực, không vi phạm luật sở hữu trí tuệ và pháp luật Việt Nam Nếu sai, tôi hoàn toàn chịu trách nhiệm trước pháp luật
TÁC GIẢ LUẬN VĂN
Nguyễn Tuấn Anh
Trang 4LỜI CẢM ƠN
Lời đầu tiên tôi xin bày tỏ lòng cảm ơn và biết ơn chân thành nhất của mình tới tất cả những người đã hỗ trợ, giúp đỡ tôi trong quá trình thực hiện luận văn tốt nghiệp
Tôi xin cảm ơn Khoa Công nghệ Thông tin, phòng Sau Đại học cũng như các thầy cô giáo trong khoa đã giúp đỡ, tạo mọi điều kiện thuận lợi nhất,
hỗ trợ, giảng dạy giúp đỡ tôi trong quá trình học tập và làm luận văn tốt
nghiệp Đặc biệt tôi muốn gửi lời cảm ơn chân thành đến TS Lê Hồng Trang,
là người hướng dẫn, nhận xét, giúp đỡ để tôi có thể hoàn thành được luận văn này
Nhân đây, tôi xin kính chúc các Thầy, Cô giáo sức khỏe và tiếp tục đạt nhiều thành công trong nghiên cứu khoa học và trong sự nghiệp giảng dạy, chúc Khoa Công nghệ Thông tin ngày một phát triển
Mặc dù đã có nhiều cố gắng nhưng quá trình thực hiện luận văn không thể tránh khỏi thiếu sót, vì vậy tôi rất mong nhận được những ý kiến đóng góp
bổ sung của thầy cô giáo và các bạn để luận văn của tôi được hoàn thiện hơn
Tôi xin chân thành cảm ơn !
Hà Tĩnh, tháng 05 năm 2017
Học viên Nguyễn Tuấn Anh
Trang 5MỤC LỤC
LỜI CẢM ƠN 1
Danh mục ký hiệu 5
MỞ ĐẦU 6
1 Sự cần thiết của vấn đề nghiên cứu 6
3 Mục tiêu nghiên cứu 6
4 Đối tượng và phạm vi nghiên cứu 6
5 Nội dung nghiên cứu 7
6 Đặc điểm và Phương pháp nghiên cứu 7
7 Kết cấu của luận văn 7
Chương 1: Kiến thức cơ sở 7
Chương 2: Thuật toán Dijkstra và thuật toán tìm tiếp tuyến với một đường gấp khúc lồi 7
Chương 3: Thuật toán tìm đường đi ngắn nhất giữa 2 điểm trong đa giác đơn sử dụng kỹ thuật “phễu” của Lee và Preparata 8
Chương 1 KIẾN THỨC CƠ SỞ 9
1.1 Lý thuyết đồ thị và độ phức tạp của thuật toán 9
1.1.1 Định nghĩa đồ thị 9
1.1.2 Đường đi trong đồ thị 11
1.1.3 Một số tính chất về đường đi trong đồ thị 12
1.1.4 Cây và chu trình 12
1.2 Định nghĩa đa giác đơn và đường gấp khúc 12
1.3 Phép tam giác phân đa giác 15
Chương 2 THUẬT TOÁN DIJKSTRA VÀ THUẬT TOÁN TÌM TIẾP TUYẾN VỚI MỘT ĐƯỜNG GẤP KHÚC LỒI 16
2.1 Thuật toán Dijstra 16
2.1.1 Thuật toán Dijkstra 16
2.1.2 Chứng minh tính đúng đắn của thuật toán Dijkstra 17
2.1.3 Độ phức tạp thuật toán Dijkstra 18
2.2 Thuật toán tìm tiếp tuyến với một đường gấp khúc lồi 18
Chương 3 THUẬT TOÁN TÌM ĐƯỜNG ĐI NGẮN NHẤT GIỮA HAI ĐIỂM TRONG ĐA GIÁC ĐƠN SỬ DỤNG KỸ THUẬT “PHỄU” CỦA LEE VÀ PREPARATA 22
Trang 63.1 Cây đối ngẫu 22
3.2 Hình ống tay và hình phễu 24
3.3 Thuật toán tìm đường đi ngắn nhất giữa hai điểm trong hình ống tay 27
3.4 Chứng minh tính đúng và đánh giá độ phức tạp của thuật toán 29
3.4.1 Chứng minh tính đúng đắn của thuật toán 29
3.4.2 Đánh giá độ phức tạp của thuật toán 31
3.5 Ví dụ minh họa 31
TÀI LIỆU THAM KHẢO 44
Trang 7Danh mục ký hiệu
[a, b] hoặc ab Đoạn thẳng nối 2 điểm a và b
a 1 a 2 a k Đường gấp khúc đi qua các đỉnh a1, a 2, , a k
xyz Tam giác có 3 đỉnh lần lượt là x, y, z
Trang 8MỞ ĐẦU
1 Sự cần thiết của vấn đề nghiên cứ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án hiệu quả và thực thi trên máy tính cho những bài toán hình học Trong hì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, Chính vì vai trò quan trọng của ứng dụng tìm đường đi ngắn nhất nên trong luận văn này chúng tôi tập trung nghiên cứu thuật toán để giải quyết vấn
đề này
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ọc quan tâm nghiên cứu như: O’Rourke, Dijkstra, Preparata, Lee, Berg, Kreveld, Guibas, Hershberger,
Leven, Với những ưu điểm đó nên tôi chọn để tài “Thuật toán hình phễu tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn” làm luận văn tốt
nghiệp Luận văn tập trung nghiên cứu thuật toán tìm đường đi ngắn nhất giữa hai điểm trong một đa giác đơn trong không gian 2 chiều
3 Mục tiêu nghiên cứu
Luận văn trình bày khái niệm của đồ thị và chứng minh tính chất chi tiết của đồ thị, từ đó trình bày chi tiết thuật toán chính 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
4 Đối tượng và phạm vi nghiên cứu
- Nghiên cứu và tìm hiểu vể lý thuyết đồ thị;
- Nghiên cứu về thuật toán hình phễu của Lee và Preparata;
- Nghiên cứu ngôn lập trình C và cài đặt thuật toán hình phễu của Lee và Preparata
Trang 95 Nội dung nghiên cứu
- Nghiên cứu về thuật toán hình phễu của Lee và Preparata;
- Ưu điểm, nhược điểm của thuật toán hình phễu của Lee và Preparata;
- Các ứng dụng của thuật toán hình phễu của Lee và Preparata
6 Đặc điểm và Phương pháp nghiên cứu
Nghiên cứu, tìm hiểu một số kiến thức về lý thuyết đồ thị, phép tam giác phân đa giác, độ phức tạp thuật toán để làm kiến thức cơ sở ban đầu
Nghiên cứu hiểu rõ các định nghĩa và các tính chất về cây đối ngẫu của một phép tam giác phân đa giác đơn, hình ống tay, phễu và các thuật toán xác định hình ống tay, thuật toán phễu của Lee và preparata Chứng minh tính đúng đắn của thuật toán phễu và đưa ra ví dụ minh họa thuật toán đó
Nghiên cứu các tài liệu về thuật toán hình phễu của Lee và Preparata và
sử dụng ngôn ngữ lập trình C cài đặt bài toán và chạy thử để đánh giá kết quả
7 Kết cấu của luận văn
Luận văn được trình bày trong 3 chương:
Chươ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ị, phép tam giác phân đa giác Đây là những kiến thức cơ sở cần thiết cho chương 2 và chương 3
Chương 2: Thuật toán Dijkstra và thuật toán tìm tiếp tuyến với một đường gấp
khúc lồi
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 tìm tiếp tuyến với một đường gấp khúc lồi và xem như là những chương trình con của thuật toá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
Trang 10Chương 3: Thuật toán tìm đường đi ngắn nhất giữa hai điểm trong đa giác đơn
sử dụng kỹ thuật “phễu” của Lee và Preparata
Chương này trình bày chi tiết thuật toán sử dụng kỹ thuật phễu của Lee
và Preparata trong bài báo đăng trên tạp chí Networks năm 1984 Nội dung chương cũng sẽ trình bày cài đặt thuật toán, cũng như đưa ra các nhận xét và đánh giá về thuật toán
Trang 11Chươ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ị, phép tam giác phân đa giác Đây là những kiến thức cơ sở cần thiết cho chương 2 và chương 3 Nội dung của chương được trích dẫn từ các tài liệu [1, 3, 5, 6, 7]
1.1 Lý thuyết đồ thị và độ phức tạp của thuật toán
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 giao thông của một thành phố, sơ đồ tổ chức một cơ quan, sơ đồ khối tính toá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ị
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ĩa như sau
Định nghĩa 1.1.1 Đồ thị là một cặp G = (V, E) trong đó:
• V là tập đỉnh (vertex)
Ví dụ 1.1.1 Đồ thị G cho ở Hình 1.1 với tập các đỉnh V = {a, b, c, d, e} và tập
các cạnh E = {(a, b), (a, c), (b, c), (d, b), (d, c), (e, a), (e, b), (e, d)}
Trang 12Nếu (a, b) là một cạnh của đồ thị thì ta nói rằng đỉnh b kề với đỉnh a và 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ạ kề như sau:
Định nghĩa 1.1.2 Đồ thị G là một cặp G = (V, F), trong đó:
• V là tập đỉnh
• F : V → Z, F là ánh xạ cho ta mỗi liên hệ giữa một đỉnh với tập các
đỉnh kề với nó (ánh xạ kề) Sự tương đương của hai định nghĩa được thể hiện bằng mệnh đề sau đây
∀x, y ∈ V : (x, y) ∈ E ⇔ y ∈ F(x)
Về bản chất, đồ thị là một tập hợp các đối tượng được biểu diễn bằng các đỉnh và giữa các đối tượng này có một quan hệ nhị nguyên biểu diễn bằng các
cạnh 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 Đồ 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à đồ 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ướng tương ứng
Định nghĩa 1.1.4 Đồ 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 Đồ 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ạn thẳng, biểu diễn
cạnh có hướng bằng mũi tên nối hai đỉnh của đồ thị
Trang 13Định nghĩa 1.1.6
1 Hai đỉnh của đồ thị G được gọi là liên thông, nếu trên đồ thị có đường
đi vô hướng nối chúng với nhau
2 Đồ thị được gọi là liên thông nếu mọi cặp đỉnh của đồ thị đều liên thông với nhau
Định nghĩa 1.1.7 Bậc của một đỉnh đồ thị là số cạnh kề với đỉnh đó
1.1.2 Đường đi trong đồ thị
Ta nói rằng đường đi này đi từ đỉnh đầu xi đến đỉnh cuối xk 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 đôi mộ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 Đồ 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
• Đường đi có trọng số bé nhất:
Độ dài của đường đi trong đồ thị có trọng số bằng tổng các trọng số của các
cạnh trên đường đi đó Độ dài đường đi có trọng số bé nhất đi từ đỉnh a đến đỉnh b gọi là khoảng cách từ đỉnh a đến đỉnh b Nếu không có đường đi từ a đến b thì ta đặt khoảng cách bằng ∞
Trang 141.1.3 Một số tính chất về đường đi trong đồ thị
Định lý 1.1.1 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
Định lý 1.1.2 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ị đó
1.1.4 Cây và chu trình
Định nghĩa 1.1.1 Chu trình là một đường đi khép kín (đỉnh cuối trùng với đỉnh
đầu của đường đi)
Chu trình đơn là chu trình mà các đỉnh trên nó khác nhau từng đôi một
Trong đồ thị G = (V, E), bậc của đỉnh v trong đồ thị, kí hiệu là deg(v) là số cạnh
kề với đỉnh v Tiếp theo, chúng tôi trình bày một khái niệm cơ bản trong lý
thuyết đồ thị Đó là khái niệm cây được Caley đưa ra đầu tiên vào năm 1857
Cây là đồ thị vô hướng liên thông không có chu trình
1.2 Định nghĩa đa giác đơn và đường gấp khúc
Để có thể định nghĩa chính xác về đa giác đơn, ta cần phải sử dụng kết
quả của định lý đường cong Jordan Định lý đường cong Jordan đã chỉ ra rằng bất kỳ một đường cong đơn khép kín nào cũng chia mặt phẳng thành 2 phần, trong đó có một phần bị giới hạn bởi phần còn lại
Để có thể định nghĩa về đường cong đơn khép kín là một vấn đề không
dễ Theo lý thuyết topo đường cong đơn khép kín J còn gọi là đường cong
Jordan, là ảnh của một ánh xạ liên tục 1 - 1 từ ℝ/ℤ vào ℝ2
Hai phần được xác định bởi một đường cong Jordan được gọi là phần
trong và phần ngoài của đường cong Trong đó, miền bị chặn được gọi là phần
trong và miền không bị chặn được gọi là phần ngoài Đây cũng là cơ sở để có
thể xây dựng định nghĩa về đa giác đơn Trước hết, ta cần nhắc lại một số khái
niệm cơ bản có liên quan
Trang 15Không gian ℝn (∀n > 1) được trang bị chuẩn ‖𝑥‖ = √𝑥12+ 𝑥22+ ⋯ 𝑥𝑛2
với x = (x1 , x 2 , ., x n) ∈ ℝn được gọi là không gian Euclid n chiều, kí
hiệu 𝔼 = ℝn
Kí hiệu d(x, y) là khoảng cách Euclid giữa hai điểm x,y trong E Đường
đi trong ℝ 2 là một ánh xạ liên tục γ : [a, b] ⊂ ℝ → ℝ 2
Nếu γ(a) = x và γ(b) = y thì x, y là các điểm cuối của γ và ta nói rằng
đường γ nối các điểm x và y
Một phân hoạch của đoạn [a, b], kí hiệu là 𝜎 được xác định bởi một dãy
Đoạn thẳng đi qua hai điểm a và b, kí hiệu là [a, b] hoặc ab là một tập
con đóng của đường thẳng đi qua hai điểm a và b, các điểm này được gọi là các
điểm cuối của đoạn thẳng [a, b] Tập con đóng ở đây bao gồm cả các điểm cuối
Đa giác đơn là miền phẳng được giới hạn bởi một tập hữu hạn các đoạn
thẳng tạo thành một đường cong đơn khép kín Tuy nhiên, để tránh đưa lý
thuyết topo vào bài viết chúng ta trình bày định nghĩa đa giác đơn như sau
Định nghĩa 1.2.2 Cho v0, v1, v2, , vn−1 là n điểm thuộc cùng một mặt phẳng,
kí hiệu ei = [vi, vi+1] với 0 ≤ i ≤ n − 1 và vn ≡ v0 là n đoạn thẳng nối các điểm đã
cho Khi đó miền trong được giới hạn bởi những đoạn thẳng này được gọi là
một đa giác đơn nếu và chỉ nếu chúng thỏa mãn các điều kiện sau:
1 Mỗi đoạn thẳng kề nhau ei và e i+1 có duy nhất một điểm chung là vi+1
Tức là ei ∩ e i+1 = vi+1 với i = 0, , n −1
Trang 162 Các đoạn thẳng không kề nhau thì không cắt nhau Tức là ei ∩ ej =
với j ≠ i + 1 Điểm vi được gọi là đỉnh của đa giác đơn và đoạn ei gọi là cạnh
của đa giác đơn Kí hiệu đa giác đơn với các đỉnh vi là P = (v0, v1, , vn−1)
Đường gấp khúc q1q2 q k là một dãy có thứ tự các điểm qi (i = 1, 2, , k) sao cho mỗi cặp điểm kề nhau q i và qi+1 (i = 1, 2, , k−1) thể
hiện một đoạn thẳng Các điểm qi gọi là các đỉnh của đường gấp khúc
Một đường gấp khúc gọi là đơn nếu bất kỳ hai đoạn thẳng không liên
tiếp trong đó đều không cắt nhau
Tiếp theo, chúng tôi trình bày định nghĩa về tiếp tuyến và đường cong
lồi theo như sau Một đường thẳng l đi qua một điểm A của đường cong γ được
gọi là một tiếp tuyến với γ tại A nếu đường cong đó nằm hoàn toàn trong nửa
mặt phẳng được xác định bởi l Đường cong γ được gọi là đường cong lồi nếu
mỗi điểm trên đó đều tồn tại duy nhất một đường tiếp tuyến
Đa giác không
đơn
Đa giác đơn
Hình 1.2: Minh họa đa giác
Trang 171.3 Phép tam giác phân đa giác
và thỏa mãn điều kiện không cắt bất kỳ cạnh nào của P, với j ≠ i + 1 và
0 ≤ i, j ≤ n − 1 Hai đường chéo gọi là không cắt nhau nếu tập hợp các giao
điểm của chúng nằm trong tập hợp các điểm cuối của chúng
Phép tam giác phân đa giác là phép phân chia một đa giác P thành các
tam giác bởi các đường chéo không cắt nhau của P Với một đa giác tùy ý luôn
tồn tại ít nhất một cách tam giác phân đa giác Có nhiều thuật toán tam giác
phân khác nhau đã được nghiên cứu với độ phức tạp về thời gian là O(nlogn)
hoặc độ phức tạp là O(n)
1 Mỗi đa giác có số đỉnh lớn hơn hoặc bằng 4 đều tồn tại ít nhất một
đường chéo
2 Mỗi đa giác P có n đỉnh đều có thể phân chia thành các tam giác bằng
cách thêm vào (tối thiểu là 0) các đường chéo
3 Mỗi phép tam giác phân một đa giác P có n đỉnh sử dụng n − 3 đường
chéo và chia P thành n − 2 tam giác
Trang 18Chương 2 THUẬT TOÁN DIJKSTRA VÀ THUẬT TOÁN TÌM TIẾP TUYẾN
VỚI MỘT ĐƯỜNG GẤP KHÚC LỒI
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 tìm tiếp tuyến với một đường gấp khúc lồi và xem như là những chương trình con của thuật toá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 Nội dung của chương này được trích dẫn từ tài liệu [2, 8]
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
2 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 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
Thuật toán 2.1.1 (DIJKSTRA(G, a, b))
Input: Đồ thị có trọng số không âm G = (V, E) với n đỉnh,
a, b ∈ V
Output: Đường đi ngắn nhất từ a đến b
for v ∈ V do
d(v) := ∞;
Trang 192.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∗
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 ∈ S1 thì d(b) là độ dài đường đi ngắn nhất từ
a đến b
Trang 202.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)
2.2 Thuật toán tìm tiếp tuyến với một đường gấp khúc lồi
Trong mục này, chúng tôi trình bày các bước chi tiết để từ điểm x tìm
tiếp tuyến với một trong hai đường gấp khúc lồi ua u a+1 ub và ua u a−1 u0 với
đỉnh là ua
Input Cho hai đường gấp khúc lồi D1 = ua u a+1 ub và D2 = ua u a−1 u0
với đỉnh là ua
Output Tiếp tuyến với một trong hai đường gấp khúc trên
Kí hiệu slope([a, b]) là hệ số góc của đoạn [a, b] và gọi y là tiếp điểm của tiếp
tuyến cần tìm
• So sánh slope([x, ua]) với hệ số góc của các đoạn ua u a−1 và ua u a+1
– Nếu slope([x, ua]) nằm giữa hai hệ số góc còn lại thì gán y := ua
– Nếu cả hai hệ số góc của các đoạn uaua−1 và uaua+1 đều lớn hơn
nhỏ hơn
– Ngược lại, thực hiện tìm kiếm ở đường gấp khúc có hệ số góc lớn hơn
Các hình vẽ chi tiết cho từng trường hợp của thuật toán tìm tiếp tuyến
với một đường gấp khúc lồi được chúng tôi minh họa như sau
Trang 21- Trường hợp slope([x, ua]) nằm giữa hệ số góc của các đoạn ua u a−1
Trang 22- Trường hợp slope([x, ua]) lớn hơn hệ số góc của các đoạn ua u a−1
và ua u a+1
• Tìm kiếm tiếp tuyến tại một trong hai đường gấp khúc đã xác định được
ở trên như sau:
Lần lượt xét các đỉnh ui với 0 ≤ i ≤ a nếu tìm trên đường D2 hoặc với
a < i ≤ b nếu tìm trên D1
– Nếu cả hai cạnh kề tại đỉnh ui đều có hệ số góc lớn hơn hoặc bằng với
slope([x, u i]) thì y là đỉnh kề ở phía bên trái của ui