私の理解では、以下に示す隣接リストを使用して、ダイクストラアルゴリズムの時間の複雑さをbig-O表記として計算しました。それは想定されていたように出てこなかったので、それを段階的に理解するようになりました。
O(log(V))
です。E*logV
。O(VElogV)
です。ただし、ダイクストラアルゴリズムの時間の複雑さはO(ElogV)です。どうして?
ダイクストラの最短経路アルゴリズムはO(ElogV)
です。ここで:
V
は頂点の数ですE
はエッジの総数です分析は正しいですが、シンボルの意味は異なります!アルゴリズムはO(VElogV)
であると言います。ここで:
V
は頂点の数ですE
は、単一ノードに接続されたエッジの最大数です。E
の名前をN
に変更しましょう。そのため、ある分析ではO(ElogV)
と言い、別の分析ではO(VNlogV)
と言います。両方とも正しく、実際はE = O(VN)
です。違いは、ElogV
はより厳密な見積もりであるということです。
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)のスパースグラフの方が優れているため、合計実行時間はデータ構造と入力クラスの両方に依存するという事実に常に注意してください。