Sơ đồ thuật toán Dijkstra kết hợp với Fibonacci Heap

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán dijkstra fibonacci heap, thuật toán ACO tìm đường đi tối ưu và ứng dụng (Trang 35 - 37)

Ở mục 1.4.2 chúng ta đã đưa ra sơ đồ thuật toán Dijkstra nguyên thủy với độ phức tạp O(n2) đó là:

procedure dijkstra;

// input: Đồ thị G, các biến toàn cục s, t; // ouput: Khoảng cách từ s đến t; begin Repeat u := FindMin(); if u = t then exit; Đánh dấu u đã cố định;

Repair(u); // tiến hành sửa nhãn cho các đỉnh kề u Until False;

Bây giờ chúng ta sẽ tổ chức mảng nhãn d theo cấu trúc Fibonacci heap, khi đó mô hình thuật toán Dijkstra có thể viết lại như sau:

procedure dijkstra_fibo_heap;

// input: Đồ thị G, đống H. S, t là các biến toàn cục. // output: Khoảng cách từ s đến t.

begin Repeat

P := FIB_HEAP_EXTRACT_MIN(H);

u := p^. u; // u là một trường mới của các nút trong Fibonacci heap để lưu nhãn //của đinh (tên đỉnh) mà nút đại diện.

if u = t then exit; Đánh dấu u đã cố định ; for (v thuộc ke(u)) do

if (d[v] > d[u] + c[u,v] ) then begin d[v] := d[u] + c[u,v]; FIB_HEAP_DECREASE_KEY(H, ptr[v], d[v]) ;// ptr[v] là nút trong //H có nhãn là v. end; Until false; end;

Vòng lặp Repeat thực hiện lặp tối đa là n lần, thao tác FIB_HEAP_ EXTRACT_MIN(H) trích nút cực tiểu có độ phức tạp là O(logn), vì thế tính

trong toàn bộ vòng repeat thì tổng số thao tác này có độ phức tạp là O(nlogn). Thao tác FIB_HEAP_DECREASE_KEY(H, ptr[ v], d[v]) có độ phức

tạp là O(1), số lần lặp trong một vòng for chỉ bằng số lượng đỉnh kề u, vì vậy nếu chúng ta sử dụng danh sách liên kết để tổ chức các cạnh thì độ phức tạp của tất cả các vòng lặp for trong vòng lặp repeat sẽ là O(m).

Từ hai nhận xét trên suy ra thuật toán Dijkstra Fibonacci heap có độ phức tạp là cỡ O(nlogn +m), với m là số cạnh của đồ thị. Với những đồ thị

thưa thì đây sẽ là một thuật toán rất tốt.

Một phần của tài liệu (LUẬN văn THẠC sĩ) thuật toán dijkstra fibonacci heap, thuật toán ACO tìm đường đi tối ưu và ứng dụng (Trang 35 - 37)

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

(74 trang)