グラフのエッジを格納するためのデータ構造


8

私は現在修士論文に取り組んでおり、それはグラフのクラスタリングについてです。私は問題を解決するためにアリを使用するアイデアで働いています。私は現在実装に取り​​組んでおり、グラフのエッジをどの程度正確に表すのか正確に疑問に思っています。

各エッジには、フェロモン値やアリがそのエッジを訪れた回数などの特定の情報が追加されます。私は無向グラフを操作しますが、これはかなり巨大になる可能性があり(100万頂点を超える)、エッジを格納してルックアップするための最も効率的な方法は何かと思っていましたか?私は規則に固執し、頂点IDが低く、頂点ID が高いものに従ってエンドポイントを格納することを考えてい(とはデータ構造のエッジのエンドポイントです)。しかし、私はこの場合ルックアップをどのように実行するのでしょうか?v1v2v1v2

私が隣接行列からエッジ配列に思いついたマッピングがありますが、それは基礎となるグラフが完全なグラフである場合にのみ機能します。だから、私はルックアップを効率的にする必要があると同時に、グラフが巨大になるのでエッジのストレージスペースを爆破したくないので、どうすればよいかについていくつかの提案を得るためにここに来ました。


1
グラフは疎ですか、密ですか?答えはそれに依存しているからです。
Bartosz Przybylski 2013

ああ、私はそう言ったはずです、ええ、それらはほとんどスパースグラフです。基本的に、私が使用するグラフは、通常スパースである現実のネットワークを表します。:)
泥だらけ

隣接リストをソートしましたか?
ラファエル

回答:


5

グラフが疎な場合は、隣接関係の「リスト」を使用して保存する必要がありますが、リストよりも効率的なものが必要な場合があります(または使用法によってはそうでない場合もあります)。各エッジを両方のエンドポイントに保存するのが最も簡単です。これはさまざまな方法で実装できます。たとえば、すべてのデータを大きな配列に格納し、隣接関係の「リスト」にはポインタのみを格納できます。


これまでは、隣接リストのアプローチを使用してきましたが、各頂点について、その近傍の配列があります(各頂点はオブジェクトです)。この方法は、各アリがすべての頂点の近傍を知っているために役立ちます。しかし、フェロモン情報と計算するその他のデータに基づいて、次に横断するエッジを選択する必要があります。重複を導入したくないので、各エッジを個別に表現する方法があるかどうか疑問に思っていましたが、すべての反復で各エッジに対して多くのルックアップが必要になるため、同時に効率的にインデックスを付けることができます。
泥だらけの

例として、グラフが完成した場合のエッジ配列のインデックスへの可能なマッピングを次に示します。この場合、エッジ配列のサイズはn(n-1)になることがすでにわかっています。ここで、nは頂点の数です。したがって、[x] [y]隣接行列を配列インデックス(idx)に変換するには、次のようにします。x<= yの場合、idx = n * x-x *(x + 1)/ 2 +(y-x- 1)else idx = n * y-y *(y + 1)/ 2 +(x-y-1)つまり、エッジ(5,11)または(11,5)はどちらも同じ配列インデックスに変換されます。しかし、私は完全なグラフを扱っていないので、マッピングを考えることはできません。
泥だらけの

2
密なグラフに対してのみ意味のあるデータ構造を使用し続ける必要があります。スパースグラフの場合、アプローチは常に、どういうわけか、各頂点について、それに付随するすべてのエッジを格納することです。重複はありません-データは1つの場所にのみ保存されます。しかし、データへの2つのポインタがあります。高速のインデックス作成は、検索ツリー、ハッシュテーブルなどを使用して実装できます。これらにより、高速に実装でき、スペースのオーバーヘッドをあまり大きくせずにうまくいけばうまくいきます。G[x][y]
Yuval Filmus 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.