1. 程式人生 > >Dijkstra演算法時間複雜度

Dijkstra演算法時間複雜度

question:

我只知道是O(n2),不知道怎麼算來的,請詳細講一下。

網上一搜全都是這句話:
Dijkstra 演算法最簡單的實現方法是用一個連結串列或者陣列來儲存所有頂點的集合 Q,所以搜尋 Q 中最小元素的運算(Extract-Min(Q))只需要線性搜尋 Q 中的所有元素。這樣的話演算法的執行時間是 O(n2)。

沒說怎麼得到這個n2的.

附演算法:
1 function Dijkstra(G, w, s)
2 for each vertex v in V[G]
3 d[v] := infinity
4 previous[v] := undefined
5 d[s] := 0
6 S := empty set
7 Q := set of all vertices
8 while Q is not an empty set
9 u := Extract_Min(Q)
10 S := S union {u}
11 for each edge (u,v) outgoing from u
12 if d[v] > d[u] + w(u,v)
13 d[v] := d[u] + w(u,v)
14 previous[v] := u

answer:

行2--4的初始化對n個頂點進行,顯然是O(n)
5--6行O(1)
7行n個頂點入佇列O(n)
8行--14行,從8行可以看出進行了n遍迴圈,每遍在第九行呼叫一次ExtractMin過程,ExtractMin過程需要搜尋鄰接表,每一次需要搜尋整個陣列,所以一次操作時間是O(n);11行到14行對節點u的鄰接表中的邊進行檢查,總共有|E|次(總共.每條邊最多檢查一次),因此是O(E);合起來就是O(E+n*n) = O(n^2);

以上合起來就是O(n)+O(1)+O(n)+O(n^2) == O(n^2).