web-dev-qa-db-ja.com

隣接リストを使用して表されたグラフに対して、頂点の追加操作を一定の時間でどのように実行できますか?

隣接リストを使用して表されるグラフに頂点を追加するには、O(1)時間計算量 http://bigocheatsheet.com/ (グラフ操作>隣接リスト>頂点を追加)。

隣接リストは配列内のすべての頂点を保持し、隣接する頂点のリンクリストを維持すると言われています。頂点を追加する場合は、操作がOになるように、配列全体を余分なスペースのある新しい配列にコピーする必要があります(| v |)時間ですが、彼らは言うO(1)それはどのように可能ですか?

1
k4vin

隣接リスト表現の「リスト」が必ずしも生の配列であるとは限らないので、それは可能です。

特に、リンクリストへの新しいノードの追加はO(1)操作であるため、リンクリストから隣接リストを作成する場合、新しいノードまたはエッジの追加はO(1)です。 )。

リンクしたグラフが指摘しているように、スタックとハッシュテーブルにもO(1)挿入があるので、それらも使用できますが、スタックを使用すると、他の多くの操作が非常に不便になります。ハッシュテーブルはO(1)正当化するのが難しいハッシュ関数についてのいくつかの強い仮定が与えられているため、通常、隣接リストは一定の時間のノードが必要な場合、リンクリストから作成されると想定/エッジ挿入。

O(| v |)の最悪のケースはまれにしか発生しないため、配列を使用した場合でも、ノードの挿入にamortized一定時間の複雑さがあることに注意してください。リンクしたチャートに償却済みの複雑さが含まれているかどうかは不明です。

4
Ixrec