隣接リストまたはマトリックスがいつより良い選択ですか?


14

グラフがスパースの場合はリストを使用し、グラフがデンスの場合はマトリックスを使用すると言われました。私にとって、それは単なる生の定義です。私はそれ以上のことを見ていません。いつ自然な選択になるかを明確にできますか?

前もって感謝します!



「スパース」と「デンス」の単一の定義がないため、これは定義ではありません。また、グラフのどの側面にアクセスする頻度など、他の考慮事項もあります。
— ラファエル

@Raphael他の考慮事項についてさらに詳しく説明できますか?
— user21312

1
@ user21312、大きな違いは、反復性とエッジのアクセスです。エッジを繰り返し処理する必要がある場合は、adjリストの方が便利な場合があります。エッジが存在するかどうかを判断したり、その重み(またはその他の情報)にアクセスする必要がある場合は、マトリックスの方が適している可能性があります。
— ライアン

あなたの目的のために、「スパース」と「デンス」の定義については不注意かもしれません。各タイプのデータ構造に使用する行列演算の時間の複雑さをモデル化し、「密度のブレークポイント」がどこにあるかを確認してください。私は@ryanにより第2のリンクが同様の何かをしようとしていると思う
— Apiwat Chantawibul

回答:


16

まず、スパースはエッジが非常に少ないことを意味し、デンスはエッジが多いこと、またはほぼ完全なグラフを意味することに注意してください。完全なグラフでは、n(n−1)/2エッジがあります。ここで、nはノードの数です。

ここで、マトリックス表現を使用する場合、ノード接続情報を格納するためにマトリックスを割り当てます。たとえば、ノードiとjの間にエッジがある場合はM [ i ] [ j ] = 1、そうでない場合はM [ i ] [ j ] = 0。 しかし、隣接リストを使用する場合、ノードの配列があり、各ノードは、隣接ノードのみを含む隣接リストを指します。n×nM[i][j]=1ijM[i][j]=0

グラフがまばらで、マトリックス表現を使用する場合、ほとんどのマトリックスセルは未使用のままになり、メモリの浪費につながります。したがって、通常、スパースグラフには行列表現を使用しません。隣接リストを優先します。

ただし、グラフが密集している場合、エッジの数は(完全な)に近く、グラフが自己ループで方向付けられている場合はn 2に近くなります。その場合、マトリックスよりも隣接リストを使用する利点はありません。n(n−1)/2n2

空間の複雑さの観点から、
隣接行列: 隣接リスト:O (n + m ) ここで、nはノードの数、mはエッジの数です。O(n2)
O(n+m)
nm

グラフが無向木である場合、
隣接行列: 隣接リスト:O (n + n )はO (n )(n 2より良い)O(n2)
O(n+n)O(n)n2

グラフが自己ループで方向付けられ、完了したら、
隣接行列: 隣接リスト:O (n + n 2)はO (n 2)(差なし)O(n2)
O(n+n2)O(n2)

最後に、マトリックスを使用して実装する場合、2つのノード間にエッジがあるかどうかの確認には回かかりますが、隣接リストではnに線形時間がかかる場合があります。O(1)n


「隣接リストの場合、線形時間がかかる場合があります」-隣接リストに(おそらく)自然な順序がない場合、ハッシュセットではなくリストになるのはなぜですか?
— ケビン

1
@Kevinそれは「リスト」ではなく「隣接ハッシュ」と呼ばれます。可能です、なぜですか?しかし、単にDFSまたはBFS、またはすべてのノードを体系的にスキャンする他の手順を実行する場合、ハッシュリストを使用する利点は何ですか?いずれの場合でも、すべての隣接ノードを検査します。
— fade2black

3
重みのない無向の場合、ほぼ完全なグラフの場合、その補数、つまりまばらなグラフを保存する方が実行可能性が高いと付け加えます。したがって、マトリックスは、エッジの約半分が存在する場合に役立ちます。
— M.冬の

3

簡単なアナロジーを提供して答えます。6オンスの水を貯蔵しなければならなかった場合、5ガロンの容器、または8オンスのカップでそれをしますか?

さて、あなたの質問に戻ってください。マトリックスの大部分が空の場合、なぜそれを使用しますか?代わりに各値をリストしてください。ただし、リストが非常に長い場合は、マトリックスを使用してそれを圧縮しないのはなぜですか?

リストとマトリックスの背後にある理由は、この場合、本当に簡単です。

PSリストは実際には単一の列マトリックスです!!! (これが意思決定/シナリオのarbitrary意性をあなたに示すことを試みます)


2

ノードとE個のエッジを持つグラフを考えます。低次項を無視すると、グラフのビット行列は、エッジの数に関係なくN 2ビットを使用します。NEN2

ただし、実際に必要なビット数は?

エッジが独立していると仮定すると、ノードとE個のエッジを持つグラフの数は( N 2NE。このサブセットを保存するために必要な最小ビット数はlog2( N2(N2E)。log2⁡(N2E)

私たちは、その一般性を失わずに仮定します、つまり、半分以下のエッジが存在する。そうでない場合は、代わりに「非エッジ」のセットを保存できます。E≤N22

E = N 2の場合、log2( N 2E=N22log2⁡(N2E)=N2+o(N2)E≪N2

log2⁡(N2E)
=log2⁡(N2)!E!(N2−E)!
=2Elog2⁡N+O(low order terms)

log2⁡N2E

そうは言っても、スパース性の適切な尺度はエントロピーであり、これは最適な表現のエッジあたりのビット数でもあります。場合p=EN2−log2⁡p(1−p)p≈12

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