web-dev-qa-db-ja.com

ダイクストラ対フロイドワーシャル:すべてのノードペアで最適ルートを見つける

ダイクストラのアルゴリズムとフロイドワーシャルアルゴリズムについて読んでいます。私は、ダイクストラが1つのノードから他のすべてのノードへの最適なルートを見つけ、フロイドワーシャルがすべてのノードのペアリングに最適なルートを見つけることを理解しています。

私の質問は、すべてのペアリング間の最適なルートを見つけるためにすべての単一ノードで実行すると、ダイクストラのアルゴリズムはフロイドのアルゴリズムよりも効率的でしょうか。

ダイクストラのランタイムはO(E + VlogV)であり、フロイドはO(V)。ダイクストラが失敗した場合、この場合、ランタイムはどうなりますか?ありがとう!

27
pyt

他の人が指摘したように、フロイドワーシャルは時間内に実行されますO(n)そして、各ノードから他のノードへのダイクストラの検索を実行すると、フィボナッチヒープを使用してダイクストラの実装をバックアップすると仮定すると、O(mn + n2 ログn)。ただし、ダイクストラのアルゴリズムは負のエッジの重みでは機能しないため、任意のグラフで常にダイクストラを安全に実行できるとは限りません。

ジョンソンのアルゴリズムと呼ばれる本当に注目に値するアルゴリズムがあり、これは、そのアプローチを可能にする各ノードからのダイクストラのアルゴリズムの実行に対するわずかな変更です。グラフにネガティブエッジが含まれている場合でも機能します(ネガティブサイクルがない場合)。このアルゴリズムは、まずグラフ上で Bellman-Ford を実行して負のエッジのないグラフに変換し、次に各頂点で開始するダイクストラのアルゴリズムを使用して機能します。 Bellman-Fordは時間O(mn)で実行されるため、全体的な漸近実行時間は依然としてO(mn + n)です。2 log n)、したがってm = o(n2)(これはlittle-oof n)であることに注意してください。このアプローチは、Floyd-Warshallを使用するよりも漸近的に高速です。

ここでの注意点の1つは、これはフィボナッチヒープに裏打ちされたダイクストラのアルゴリズムがあることを前提としていることです。フィボナッチヒープがなく、ビルド、デバッグ、テストに必要な72時間を費やす気がない場合でも、ダイクストラのアルゴリズムにバイナリヒープを使用できます。実行時間をO(m log n)に増やすだけなので、このバージョンのジョンソンアルゴリズムはO(mn log n)で実行されます。これは、m =Ω(nの場合、Floyd-Warshallより常に漸近的に高速になるとは限りません。2)その後、Floyd-WarshallはO(n)ジョンソンのアルゴリズムはO(n ログn)。ただし、スパースグラフの場合、m = o(n2/log n)、ジョンソンのアルゴリズムのこの実装は、Floyd-Warshallよりも漸近的に優れています

要するに:

  • フィボナッチヒープを使用する場合、Johnsonのアルゴリズムは常に漸近的には少なくともFloyd-Warshallと同じくらい優れていますが、コードの作成は困難です。
  • バイナリヒープを使用する場合、ジョンソンのアルゴリズムは通常は漸近的には少なくともフロイドワーシャルと同じくらい優れていますが、大きくて密度の高いグラフを扱う場合には適していません。

お役に立てれば!

33
templatetypedef

すべてのノードでダイクストラを実行する場合の複雑さはO(EV + V2logV)。この複雑さはO(V)E <Vの場合2

10
Andreas Brinck

場合によります。すべてのノードに対してダイクストラを実行するとO(VE + V^2log V)が得られますが、フロイドはO(V^3)です。 E = O(V^2)の場合、2つは理論的には同じで、実際にはFloydの方が高速です。 E = O(V)の場合、理論的にも実際的にも、すべてのノードに対してダイクストラを実行する方が優れています。

基本的に、ノードと同じ数のエッジがあることが予想される場合はすべてのノードからダイクストラを実行し、ほぼ完全なグラフが予想される場合はフロイドを実行します。

3
IVlad