グラフがスパースの場合はリストを使用し、グラフがデンスの場合はマトリックスを使用すると言われました。私にとって、それは単なる生の定義です。私はそれ以上のことを見ていません。いつ自然な選択になるかを明確にできますか?
前もって感謝します!
グラフがスパースの場合はリストを使用し、グラフがデンスの場合はマトリックスを使用すると言われました。私にとって、それは単なる生の定義です。私はそれ以上のことを見ていません。いつ自然な選択になるかを明確にできますか?
前もって感謝します!
回答:
まず、スパースはエッジが非常に少ないことを意味し、デンスはエッジが多いこと、またはほぼ完全なグラフを意味することに注意してください。完全なグラフでは、エッジがあります。ここで、はノードの数です。
ここで、マトリックス表現を使用する場合、ノード接続情報を格納するためにマトリックスを割り当てます。たとえば、ノードiとjの間にエッジがある場合はM [ i ] [ j ] = 1、そうでない場合はM [ i ] [ j ] = 0。
しかし、隣接リストを使用する場合、ノードの配列があり、各ノードは、隣接ノードのみを含む隣接リストを指します。
グラフがまばらで、マトリックス表現を使用する場合、ほとんどのマトリックスセルは未使用のままになり、メモリの浪費につながります。したがって、通常、スパースグラフには行列表現を使用しません。隣接リストを優先します。
ただし、グラフが密集している場合、エッジの数は(完全な)に近く、グラフが自己ループで方向付けられている場合はn 2に近くなります。その場合、マトリックスよりも隣接リストを使用する利点はありません。
空間の複雑さの観点から、
隣接行列:
隣接リスト:O (n + m )
ここで、nはノードの数、mはエッジの数です。
グラフが無向木である場合、
隣接行列:
隣接リスト:O (n + n )はO (n )(n 2より良い)
グラフが自己ループで方向付けられ、完了したら、
隣接行列:
隣接リスト:O (n + n 2)はO (n 2)(差なし)
最後に、マトリックスを使用して実装する場合、2つのノード間にエッジがあるかどうかの確認には回かかりますが、隣接リストではnに線形時間がかかる場合があります。
ノードとE個のエッジを持つグラフを考えます。低次項を無視すると、グラフのビット行列は、エッジの数に関係なくN 2ビットを使用します。
ただし、実際に必要なビット数は?
エッジが独立していると仮定すると、ノードとE個のエッジを持つグラフの数は( N 2。このサブセットを保存するために必要な最小ビット数はlog2( N2。
私たちは、その一般性を失わずに仮定します、つまり、半分以下のエッジが存在する。そうでない場合は、代わりに「非エッジ」のセットを保存できます。
E = N 2の場合、log2( N 2
そうは言っても、スパース性の適切な尺度はエントロピーであり、これは最適な表現のエッジあたりのビット数でもあります。場合