動的グラフの関連コンポーネント情報を維持するための最も効率的なアルゴリズムとデータ構造は何ですか?


9

無向有限スパースグラフがあり、次のクエリを効率的に実行できる必要があるとします。

  • sCoectedN1N2 -戻るとの間の経路がある場合と、そうでなければN 1 N 2 FTN1N2F
  • CoectedNodesNから到達可能なノードのセットを返しますN

これは、グラフの接続されたコンポーネントを事前に計算することで簡単に実行できます。どちらのクエリも時間で実行できます。O1

エッジを任意に追加できるようにする必要がある場合ddEdgeN1N2 -次に、コンポーネントを分離セットデータ構造に格納できます。エッジが追加されるたびに、異なるコンポーネントの2つのノードを接続する場合、それらのコンポーネントをマージします。これが追加されますO1のコストddEdgeO(InverseAckermann(|Nodes|))へのコストIsConnectedCoectedNodes(同様かもしれませんO1)。

エッジを任意に削除できるようにする必要がある場合、この状況を処理するのに最適なデータ構造は何ですか?知っていますか?要約すると、次の操作を効率的にサポートする必要があります。

  • sCoectedN1N2 -返しT間の経路がある場合N1N2そうでなければ、F
  • ConnectedNodes(N)-NConnectedNodes(N)から到達可能なノードのセットを返します。N
  • AddEdge(N1,N2)つのノード間にエッジを追加します。N1N2またはその両方が以前に存在しなかった可能性があることに注意してください。
  • RemoveEdge(N1,N2つのノード間の既存のエッジを削除します。

(私はゲーム開発の観点からこれに興味があります-この問題はかなりの状況で発生するようです。おそらくプレイヤーは電力線を構築でき、発電機が建物に接続されているかどうかを知る必要があります。プレイヤーはロックできるかもしれません。ドアのロックを解除し、敵がプレイヤーに到達できるかどうかを知る必要があります。しかし、これは非常に一般的な問題なので、そのように言いました)


O 1 N Ω N C O N N E C T E D N O D E SCoectedNodesはで実行できない可能性がありますノードのリストを返す場合、時間を必要とするためです。BFSでを実装するのが最適です。したがって、潜在的なデータ構造は、IsConnected、AddEdge、およびRemoveEdgeのみをサポートする必要があります。これは、あなたの質問に関連すると思われる:stackoverflow.com/questions/7241151/...O1ΩCoectedNodes
トム・ファンデZanden

すでに構築されている一連の復帰@TomvanderZanden(プログラミングでは、ポインタまたは参照)があるのユーザーあまりないのですが...その行うことができますで覆われていない。O1CoectedNodesO1sCoected
user253751 2014年

回答:


11

この問題は動的接続と呼ばれ、理論的なコンピューターサイエンスコミュニティで活発に研究されています。まだいくつかの重要な問題が未解決のままです。

用語を明確にするため 、エッジを追加および削除するため、完全に動的な接続を要求します。Holm、de Lichtenberg and Thorup(J.ACM 2001)の結果として、更新時間とクエリ時間を達成しています。私の理解から、それは実装可能であるようです。簡単に言えば、データ構造はスパニングツリーの階層を維持し、ツリー内の動的接続は簡単にカバーできます。良い説明については、エリックD.デメインのノートをお勧めします。ビデオについては、こちらを参照してください。エリックのメモには、他の関連する結果へのポインタも含まれています。注:これらの結果はすべて理論上の結果です。Oログ2Oログ/ログログ

これらのデータ構造はConnectedNodesクエリ自体を提供しない場合がありますが、これを実現するのは簡単です。追加のデータ構造としてグラフ(たとえば、二重に接続されたエッジリストなど)を維持し、特定のノードから到達できるノードを取得するために、深さ優先検索を実行します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.