範囲から描画されるエッジの重みに対するダイクストラのアルゴリズムを変更する


10

範囲からエッジの重みが描画された有向グラフがあるとします。ここで、は定数です。ダイクストラのアルゴリズムを使用して最短経路を見つけようとしている場合、アルゴリズム/データ構造を変更して、時間の複雑さを改善するにはどうすればよいですか?[1,,K]KO(|V|+|E|)


あなたはもっと具体的にすべきです、あなたのデータ構造は何ですか?そして、あなたはより少ない得ることはできません。講義を復習する。O(V+E)
jonaprieto

個別のエッジウェイトの可能性が小さいからといって、距離の数が少ないということではありません。
Joe、

3
第1の青色を使用してグラフの色の頂点は、サイズの各エッジ分割中に(追加することによって、エッジ無色頂点)、次いで青のノードに開始ノードから最短経路を見つけるために、この新しいグラフでBFSを実行し、それの定数がある場合は。ttt1O(|V|+|E|)k

@SaeedAmiriこれを答えとして書いてみませんか?
Joe、

@Joeはダイクストラを変更しないためです(少なくとも直接ダイクストラとは関係ありません)。

回答:


16

エッジの重みが整数の場合、@ rrenaudの提案に従って、ダイクストラを時間で実行するように実装できます。これはより明確な説明です。O K | V | + | E |{0,1,,K}O(K|V|+|E|)

いつでも、優先度キューの(有限)キーは、ある範囲にありますは、優先度キューから削除された最後のキーの値です。(すべてのキーは、少なくともあるダイクストラ法により除去キーの配列が非減少であるので、すべてのキーが最大である、すべてのキーは、値有するので一部のためにエッジここで、はソースから既に削除されている頂点までの距離なので、です。)D D D + KのD [ U ] + W T U W U W D [ U ] U dは[ U ] D{D,D+1,,D+K}DDD+Kd[u]+wt(u,w)(u,w)d[u]ud[u]D

このため、各セルがバケットを含む、サイズ循環配列を使用して優先度キューを実装できます。キー各頂点をセルのバケットに格納しますここでです。追跡します。次のように操作します。K + 1 k A [ h k ]A[0..K]K+1kA[h(k)]h(k)=kmod(K+1)D

  • delete-min:が空の間に、増分します。次に、から頂点を削除して返します。A[h(D)]DA[h(D)]

  • キー挿入:バケットに頂点を追加します。kA[h(k)]

  • 減少キー から:頂点をからます。kkA[h(k)]A[h(k)]

挿入キーと減少キーは一定時間の操作であるため、これらの操作に費やされる合計時間はます。delete-minで費やされる合計時間は、に最終値を加えたものになります。の最終値は、ソースから任意の頂点までの最大(有限)距離です(回の反復を行うdelete-min により、が増えるため)。各パスのエッジは最大でであるため、最大距離は最大でです。したがって、アルゴリズムが費やした合計時間はです。O(|V|+|E|)O(|V|)DDiDiK(|V|1)|V|1O(K|V|+|E|)


私は循環キューが好きです。これは、基本的にK * vサイズの配列で、常にvサイズのスライスのみが使用されるという私の考えよりもはるかに優れています。
rrenaud

二重リンクリストを使用して実装しましたが、それでも最小キーを検索するためのO(1)であることを意味しますか?
user1675999

@ user1675999、よくわかりません。リストがキーでソートされている場合、どのようにして効率的に挿入および減少キーを実行しますか?リストがキーでソートされていない場合、delete-minを効率的に行う方法は?
Neal Young

5

ここで、は整数であり、エッジの重みは整数であると仮定します。それ以外の場合は、実際には何も購入しません。最小エッジのコストが、最大エッジのコストがになるようにウェイトをいつでも再スケールできます。したがって、問題は標準の最短パスの問題と同じです。K1K

アルゴリズム/証明のスケッチ:この種類のクレイジーな方法で優先キューを配列として実装しますリストはコストでキーイングされ、それ以外の場合は標準のダイクストラのアルゴリズムを使用します。ヒープ内の最小アイテムのコストを追跡するカウンターを維持します。線形スキャンによってアイテムが削除された後、デキュー呼び出しを解決します。はい、この種の音はめちゃくちゃですが、定数使用すると、線形スキャンに対してアルゴリズムの直感をだまして、だまします。Disjkstraのアルゴリズムはキューの実装に適しているため、最後のマーカーからスキャンするだけで済みます。デキューを要求するまでに、キューに挿入されたアイテムは常に以前の最小値以上になります。可能な最長の最短経路の長さはK×|V|KK×|V|なので、償却後のスキャンコストは Kが定数の場合。K×|V|=O(|V|)


-2

トポロジカルソートを使用してソリューションを見つけ、ソースの次数を0にして、ソースから各エッジに移動し、別の頂点の次数が0の場合、キューに入れてそれを続けます。この場合(グラフ内のサイクルなし)、すべての頂点とエッジを一度だけ通過するため、V + Eを達成できます。


質問とは無関係のようですか?質問はグラフが非循環的であるとは想定しておらず、ソリューションは重みが一定の範囲から抽出されるという事実を利用していません。
xskxzr 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.