Thuật toán Dijkstra (Đối với trường hợp ma trận trọng số không âm)

Một phần của tài liệu Ứng dụng ngôn ngữ sql trong tính toán khoa học và giảng dạy (Trang 64 - 67)

Trong trường hợp trọng số trên các cung là không âm thuật toán do Dijkstra đề nghị để giải quyết bài toán tìm đường đi ngắn nhất từ đỉnh s đến các đỉnh còn lại của đồ thị làm việc hữu hiệu hơn rất nhiều so với thuật toán khác. Thuật toán được xây dựng trên cơ sở gán cho các đỉnh các nhãn tạm thời. Nhãn của mỗi đỉnh cho biết cận trên của độ dài đường đi ngắn nhất từs đến nó. Các nhãn này sẽđược biến đổi theo thủ tục lặp, mà ở mỗi một bước lặp có một nhãn tạm thời trở thành nhãn cố định. Nếu nhãn của một đỉnh nào đó trở thành cốđịnh thì nó sẽ cho ta không phải là cận trên mà là độ dài đường đi ngắn nhất từ đỉnh s đến nó. Thuật toán được mô tả như sau:

Procedure Dijkstra;

(*Đầu vào : Đồ thị có hướng G=(V,E) với n đỉnh,

56 Giả thiết : a[u,v]≥0, u,v∈V

Đầu ra : khoảng cách từđỉnh s đến tất cảcác đỉnh còn lại d[v],v∈V. *) Begin (*khởi tạo*) for v∈V do begin d[v]:=a[s, v]; truoc [v]:=s; end; d[s]:=0;T:=V\{s};(* T là tập các đỉnh có nhãn tạm thời *) (*Bước lặp*) while T≠∅ do begin

Tim dinh u∈T thỏa mãn d[u]=min {d[z]:z∈T}; T:=T\{u};(*cốđịnh nhãn của đỉnh u*)

for v∈T do (*gán nhãn lại cho cac đỉnh trong T*) if d[v]>d[u]+a[u,v] then begin d[v]:=d[u]+a[u,v]; truoc[v]:=u; end; end; end;

57

Định lý 1. Thuật toán Dijkstra tìm đường đi có độ dài ngắn nhất trên đồ thị

sau nhãn thời gian cỡ O(n2).

Chứng minh. Trước khi tìm đường đi ngắn nhất từđỉnh s đến các đỉnh còn lại của đồ thị. Giả sử rằng ở một bước lặp nào đó các nhãn cố định cho ta độ dài các đường đi ngắn nhất từs đến các đỉnh có nhãn cốđịnh, ta sẽ chứng minh rằng ở lần lặp tiếp theo nếu đỉnh u* thu được nhãn cốđịnh thì d(u*) chính là độ dài đường đi ngắn nhất từs đến u*.

Kí hiệu S1 là tập các đỉnh có nhãn cốđịnh, S2 là tập các đỉnh có nhãn tạm thời ở bước lặp đang xét. Kết thúc mỗi bước lặp nhãn tạm thời d(v) cho ta độ dài của đường đi ngắn nhất từ s đến v chỉ qua những đỉnh nằm hoàn toàn trong tập S1. Giả sử đường đi ngắn nhất từ u đến u* không nằm trọn trong tập S1, tức là nó đi qua ít nhất một đỉnh của tập S2. Gọi z∈S2 là đỉnh đầu tiên như vậy trên đường đi này. Do trọng số trên các cung là không âm nên đoạn đường từ s đến u* có độ dài L>0 và d(z) < d(u*) - L < d(u*).

Bất đẳng thức này mâu thuẫn với cách xác định đỉnh u* là đỉnh có nhãn tạm thời nhỏ nhất. Vậy đường đi ngắn nhất từs đến u* phải nằm trọn trong tập S1 vì thế d[u*] là độ dài của nó. Do ở lần lặp đầu tiên S1={s} và sau mỗi lần lặp ta chỉ thêm vào S1 một đỉnh u* nên giả thiết là d(v) cho độ dài đường đi ngắn nhất từs đến v với mọi v∈S1 là đúng với bước lặp đầu tiên. Theo qui nạp, suy ra thuật toán cho ta đường đi ngắn nhất từs đến mọi đỉnh của đồ thị.

Bây giờ sẽđánh giá số phép toán cần thực hiện theo thuật toán. Ở mỗi bước lặp để tìm ra điểm u cần thực hiện O(n) phép toán, để gán nhãn lại cũng cần thực hiện một số lượng phép toán cũng là O(n).Thuật toán cần phải thực hiện n-1 bước lặp, vậy thời gian tính toán của thuật toán là cỡ O(n2).

Định lý được chứng minh.

Khi đã tìm được độ dài đường đi ngắn nhất d[v] thì đường đi này có thể tìm dựa vào nhãn trước [v] với v∈V.

58

Ví dụ 1: Tìm đường đi ngắn nhất từ đỉnh 1 đến các đỉnh còn lại của đồ thị ở hình sau: (7) 2 3 6 (5) (1) (1) (2) (1) (1) (4) 1 (2) 4 5 (3)

Kết quả tính toán theo thuật toán được trình bày trong bảng dưới đây. Quy ước viết thành 2 phần của nhãn theo thứ tự: d[v], truoc[v]. Đỉnh được đánh dấu * là đỉnh được chọn để cố định nhãn ở bước lặp đang xét, nhãn của nó không biến đổi ở các bước tiếp theo, vì thếta đánh dấu -.

Bảng 3.1. Bảng kết quả tính toán theo thuật toán Dijkstra

Nếu chỉ cần tìm đường đi ngắn nhất từs đến một đỉnh t nào đó thì ta có thể kết thúc thuật toán khi trở thành có nhãn cốđịnh.

Một phần của tài liệu Ứng dụng ngôn ngữ sql trong tính toán khoa học và giảng dạy (Trang 64 - 67)

Tải bản đầy đủ (PDF)

(87 trang)