web-dev-qa-db-ja.com

ダイクストラアルゴリズムの時間計算の計算について

私の理解では、以下に示す隣接リストを使用して、ダイクストラアルゴリズムの時間の複雑さをbig-O表記として計算しました。それは想定されていたように出てこなかったので、それを段階的に理解するようになりました。

  1. 各頂点は(V-1)頂点に接続できるため、各頂点に隣接するエッジの数はV-1です。Eが各頂点に接続されたV-1エッジを表すとします。
  2. 最小ヒープ内の隣接する各頂点のウェイトの検索と更新は、O(log(V)) + O(1)またはO(log(V))です。
  3. したがって、上記の手順1および手順2から、頂点のすべての隣接する頂点を更新するための時間の複雑さはE *(logV)です。またはE*logV
  4. したがって、すべてのV頂点の時間の複雑さはV *(E * logV)、つまりO(VElogV)です。

ただし、ダイクストラアルゴリズムの時間の複雑さはO(ElogV)です。どうして?

45
Meena Chaudhary

ダイクストラの最短経路アルゴリズムはO(ElogV)です。ここで:

  • Vは頂点の数です
  • Eはエッジの総数です

分析は正しいですが、シンボルの意味は異なります!アルゴリズムはO(VElogV)であると言います。ここで:

  • Vは頂点の数です
  • Eは、単一ノードに接続されたエッジの最大数です。

Eの名前をNに変更しましょう。そのため、ある分析ではO(ElogV)と言い、別の分析ではO(VNlogV)と言います。両方とも正しく、実際はE = O(VN)です。違いは、ElogVはより厳密な見積もりであるということです。

60
Shahbaz

nを頂点の数、mをエッジの数とします。

ダイクストラのアルゴリズムでは、O(n) delete-min sおよびO(m) decrease_key sがあり、それぞれコストがかかるため、 O(logn)、バイナリヒープを使用した合計実行時間はO(log(n)(m + n))になります。 decrease_keyのコストをフィボナッチヒープを使用してO(1)まで償却することは完全に可能ですが、結果として合計実行時間はO(nlogn + m)になりますが、実際にはFHの定数因子ペナルティはかなり大きく、ランダムグラフではdecrease_key sの量はそれぞれの上限よりもはるかに低いため(O(n * log(m/n)、これはm = O(n)のスパースグラフの方が優れているため、合計実行時間はデータ構造と入力クラスの両方に依存するという事実に常に注意してください。

1
timtody