web-dev-qa-db-ja.com

隣接行列を使用して表されたグラフに頂点を追加すると、なぜO(| v | ^ 2)時間の複雑さが必要になるのですか?

隣接行列を使用して表されるグラフに頂点を追加すると、 http://bigocheatsheet.com/ に従ってO(| v | ^ 2)時間の複雑さがかかります(グラフ操作>隣接行列>頂点を追加) )。

しかし、なぜ私は理由を見つけることができませんでしたか?行と列を追加するだけでよいので、もちろんO(| v |)が必要ですが、これの理由は何ですか?

4
k4vin

マトリックスは通常、隣接するメモリに格納され、コンテンツにはシーケンシャルメモリレイアウトからマトリックスセルへの定義されたマッピングが必要です_(x,y)_(典型的なマッピングは この以前の「プログラマー」の投稿 で説明されています) 。ここで、新しい頂点を追加する必要がある場合は、_|V|²_マトリックスのストレージを_(|V|+1)²_に増やす必要があります。つまり、以前の小さなマトリックスの内容全体を、大きなマトリックス用に新しく割り当てられたメモリにコピーする必要があります。これは、マッピングが適合しないためです。そして、それは明らかにO(|V|²)操作です。

たとえば、マトリックスのサイズを1つずつ大きくするのではなく、より大きなステップで、より良いメモリ割り当て戦略を提供することにより、この問題を軽減できます。

4
Doc Brown