範囲からエッジの重みが描画された有向グラフがあるとします。ここで、は定数です。ダイクストラのアルゴリズムを使用して最短経路を見つけようとしている場合、アルゴリズム/データ構造を変更して、時間の複雑さを改善するにはどうすればよいですか?
範囲からエッジの重みが描画された有向グラフがあるとします。ここで、は定数です。ダイクストラのアルゴリズムを使用して最短経路を見つけようとしている場合、アルゴリズム/データ構造を変更して、時間の複雑さを改善するにはどうすればよいですか?
回答:
エッジの重みが整数の場合、@ rrenaudの提案に従って、ダイクストラを時間で実行するように実装できます。これはより明確な説明です。O (K | V | + | E |)
いつでも、優先度キューの(有限)キーは、ある範囲にありますは、優先度キューから削除された最後のキーの値です。(すべてのキーは、少なくともあるダイクストラ法により除去キーの配列が非減少であるので、すべてのキーが最大である、すべてのキーは、値有するので一部のためにエッジここで、はソースから既に削除されている頂点までの距離なので、です。)D D D + KのD [ U ] + W T (U 、W )(U 、W )D [ U ] U dは[ U ] ≤ D
このため、各セルがバケットを含む、サイズ循環配列を使用して優先度キューを実装できます。キー各頂点をセルのバケットに格納しますここでです。追跡します。次のように操作します。K + 1 k A [ h (k )]
delete-min:が空の間に、増分します。次に、から頂点を削除して返します。
キー挿入:バケットに頂点を追加します。
減少キー から:頂点をからます。
挿入キーと減少キーは一定時間の操作であるため、これらの操作に費やされる合計時間はます。delete-minで費やされる合計時間は、に最終値を加えたものになります。の最終値は、ソースから任意の頂点までの最大(有限)距離です(回の反復を行うdelete-min により、が増えるため)。各パスのエッジは最大でであるため、最大距離は最大でです。したがって、アルゴリズムが費やした合計時間はです。
ここで、は整数であり、エッジの重みは整数であると仮定します。それ以外の場合は、実際には何も購入しません。最小エッジのコストが、最大エッジのコストがになるようにウェイトをいつでも再スケールできます。したがって、問題は標準の最短パスの問題と同じです。
アルゴリズム/証明のスケッチ:この種類のクレイジーな方法で優先キューを配列として実装しますリストはコストでキーイングされ、それ以外の場合は標準のダイクストラのアルゴリズムを使用します。ヒープ内の最小アイテムのコストを追跡するカウンターを維持します。線形スキャンによってアイテムが削除された後、デキュー呼び出しを解決します。はい、この種の音はめちゃくちゃですが、定数使用すると、線形スキャンに対してアルゴリズムの直感をだまして、だまします。Disjkstraのアルゴリズムはキューの実装に適しているため、最後のマーカーからスキャンするだけで済みます。デキューを要求するまでに、キューに挿入されたアイテムは常に以前の最小値以上になります。可能な最長の最短経路の長さはなので、償却後のスキャンコストは Kが定数の場合。
トポロジカルソートを使用してソリューションを見つけ、ソースの次数を0にして、ソースから各エッジに移動し、別の頂点の次数が0の場合、キューに入れてそれを続けます。この場合(グラフ内のサイクルなし)、すべての頂点とエッジを一度だけ通過するため、V + Eを達成できます。