• ベストアンサー

ダイクストラ法の実行時間

ダイクストラ法の実行時間が, O(n)なのは様々なサイトを見ていると分かるのですが, なぜ,O(n^2)なのかが分かりません. それと,ヒープを使った際に, O((n+m)log(n))になる理由がわかりません. どなたか,分かりやすい解説をお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

nは節点の数,mは辺の数ですか? Dijkstra のアルゴリズムの主要部分は,次の2つの繰り返し. (1) 最短路が確定していない節点の集合Qの中から,   始点sに最も近い節点Pを1つ選んで取り出す. (2) Pの隣接点の最短距離を更新. Qの初期値は,全節点から始点sを除いたものなので, 全節点数をnとするとその要素数はn-1. したがって上記のループ回数はn-1回で, Qの要素数qはn-1,n-2,…,2,1と変化する. (1) の最小要素を求める処理を単純な全数比較で行う場合,   q-1回の比較が必要.これを全ループ回数分合計すると    Σ{q=1,n-1} (q-1) = (1/2) (n^2 - 3 * n + 2) 回の比較 → O(n^2) (2) の処理時間は,Pの隣接点の個数,つまりPから出る辺の数に比例する.   これを全ループ回数分合計すると,グラフのすべての辺について1回ずつ   処理することになるので,処理時間は辺の総数mに比例する.   つまり O(m).辺の総数が最大になるのは完全グラフの場合で,   m≦nC2= n * (n-1) / 2.したがって O(m)≦O(n^2). したがって Dijkstra のアルゴリズムの処理時間は (1) と (2) を合計して, O(n^2 + m) ≦ O(n^2 + n^2) = O(n^2). Qを始点からの距離で順序付けたヒープで管理する場合は,最小値を見つける 手間は O(1) だが,それを取り出す (削除する) のに O(log(n)) の手間がかかる. これを約n回繰り返すので合計 O(n * log(n)). また (2) において,各節点の距離を更新する場合,ヒープから一旦削除 (O(log(n)) して再登録 (O(log(n)) する必要があるので1回あたり O(log(n)) + O(log(n)) = O(log(n)). これを辺の数だけ繰り返すので O(m * log(n)). 以上を合計すると, O(n * log(n)) + O(m * log(n)) = O((m + n) * log(n)). … 合ってるかな? まあ,↓アルゴリズムのデモでも見ながら考えてください.(笑) Algorithm Demo (最短路問題) http://www-or.amp.i.kyoto-u.ac.jp/research/demo/SP.html

to_koto
質問者

お礼

とても丁寧な返答,ありがとうございます. 参考意見となっていますが,ものすごく参考になります! 助かりました! これで,なんとかなりそう・・・です.

関連するQ&A

専門家に質問してみよう