web-dev-qa-db-ja.com

さまざまなデータ構造の時間の複雑さは何ですか?

配列、バイナリ検索ツリー、ヒープ、リンクリストなどの一般的なデータ構造の操作の時間的な複雑さをリストしようとしています。特にJavaに言及しています。それらは非常に一般的ですが、私たちの中には正確な答えに100%自信がない人もいると思います。ヘルプ、特に参考文献は大歓迎です。

例えば。単一リンクリストの場合:内部要素の変更はO(1)です。どうすればできますか? HAVE要素を変更する前に検索します。また、ベクターの場合、内部要素の追加はO(n)として指定されます。しかし、なぜインデックスを使用して償却された一定の時間でそれを行うことができないのでしょうか?何か足りない場合は修正してください。

最初の回答として、調査結果/推測を投稿しています。

78
Bhushan

配列

  • 特定のインデックスにあるSet、Check要素:O(1)
  • SearchingO(n)配列がソートされていない場合O(log n)配列がソートされ、バイナリ検索のようなものが使用される場合、
  • Aivean で指摘されているように、配列で利用可能なDelete操作はありません。要素を特定の値に設定することで、要素を象徴的に削除できます。要件に応じて-1、0など
  • 同様に、配列のInsertは、最初に述べたように、基本的にSetです。

配列リスト:

  • AddAmortized O(1)
  • RemoveO(n)
  • 次を含むO(n)
  • サイズO(1)

リンクリスト:

  • InsertingO(1)、先頭で行う場合、O(n)リンクリストを直線的に走査してその位置に到達する必要があるため、他の場所にある場合。
  • 削除O(1)、先頭で行われた場合、O(n)リンクリストを直線的に走査してその位置に到達する必要があるため、他の場所にある場合。
  • 検索中O(n)

二重リンクリスト:

  • 挿入O(1)、ヘッドまたはテールで行う場合、O(n)リンクリストを直線的に走査してその位置に到達しなければならないので、他の場合は。
  • 削除O(1)、ヘッドまたはテールで行われた場合、O(n)リンクリストを直線的に走査してその位置に到達しなければならないので、他の場合は。
  • 検索中O(n)

スタック:

  • PushO(1)
  • PopO(1)
  • TopO(1)
  • Search(特別な操作としてのlookupのようなもの):O(n) (たぶんそうだ)

キュー/デキュー/循環キュー:

  • 挿入O(1)
  • RemoveO(1)
  • サイズO(1)

バイナリ検索ツリー:

  • 挿入、削除、検索:平均ケース:O(log n) 、最悪の場合:O(n)

赤黒の木:

  • 挿入、削除、検索:平均ケース:O(log n) 、最悪の場合:O(log n)

ヒープ/ PriorityQueue(最小/最大):

  • 最小値/最大値を見つけるO(1)
  • 挿入O(log n)
  • 最小削除/最大削除O(log n)
  • 最小抽出/最大抽出O(log n)
  • ルックアップ、削除(ある場合):O(n) 、BSTのように順序付けされていないため、すべての要素をスキャンする必要があります

HashMap/Hashtable/HashSet:

  • 挿入/削除O(1)償却
  • サイズ変更/ハッシュO(n)
  • 以下を含むO(1)
217
Bhushan