Dijkstra algorithm

Dijkstra algorithm (ダイクストラ アルゴリズム)。


"全てのEdge(辺)のWeight(重み)が非負の場合"に、
重みつき有向グラフ G=(V,E) に対する
Single-Source Shortest-Path Problem (単一始点最短路問題)、を解くことができる。

実装の仕方により、Dijkstra algorithmの実行時間は Bellman-Ford algorithmより短くすることができる。

Dijkstra algorithmは、始点 s からの最終的な最短路重みが既に決まっているVertex(頂点)の集合 S を管理する。最小の最短路推定値 d[u] を持つ頂点 u ∈ V-S を選び、u を S に追加し、u から出る辺に対して、緩和操作 Relax の実施を繰り返す。

V-Sの全てのvertexを含み、最短路推定値 dの値をキーとする優先度つき Queue Qを管理する。

Dijkstra(G,w,s)
1. Initialize-Single-Source(G,s)
2. S ← φ
3. Q ← V[G]
4. while Q ≠φ
5.  do u ← Extract-Min(Q)
6.   S ← S ∪ {u}
7.   for each vertex v ∈ Adj[u]
8.    do Relax(u,v,w)

Initialize-Single-Source(G,s), Relax(u,v,w)はRelaxation(緩和操作)を参照


[実行時間(計算量)]

Dijkstra algorithmの実行時間は、"Min-Priority Queue(優先度つきmin-Queue)"の
実装方法に依存している。

 (1) Initialize-Single-Source(G,s)は O(V),
 [Min-Priority Queue操作]
 (2) Insert(3行目)は、      |V|回 × Insert実行時間
 (3) Extract-Min (5行目)は、   |V|回 × Extract-Min実行時間
 (4) Decrease-Key(8行目 Relax)は、|E|回 × Decrease-Key実行時間
   (For Loopの繰り返し数 |E|回)


・[Min-Priority Queueの実装例1:1から|V|に番号が振られた頂点を使用]
 単に配列のv番目の位置に 最短路推定値 d[v] を記憶すればよい。

 [2] Insertの実行時間    ... O(1)
 [3] Extract-Minの実行時間 ... O(V)
 [4] Decrease-Keyの実行時間 ...O(1)

 ⇒全体の実行時間 O(V^2 + E) = O(V^2)


・[Min-Priority Queueの実装例2:min-heapの使用]
 グラフが十分に疎 (E =o(V^2 /logV))である場合の実用的な方法。

 (2) Min-Heapの実現... O(V)
 [3] Extract-Minの実行時間 ... O(logV)
 [4] Decrease-Keyの実行時間 ...O(logV)

 ⇒全体の実行時間 O((V+E)logV)。
  全ての頂点が、始点 s から到達可能な場合、O(E logV)
  (E=o(V^2/logV)の場合における O(V^2)時間の改良)


・[Min-Priority Queueの実装例3:Fibonacci Heap(フィボナッチヒープ)の使用]

 [3] Extra-Minのならし実行時間 ... O(logV)
 [4] Decrease-Keyのならし実行時間...O(1)

 ⇒全体の実行時間 O(VlogV +E)


[Reference]:
Introduction to Algorithms, Second Edition
アルゴリズムの設計と解析手法 (アルゴリズムイントロダクション)