さまざまなデータ構造の時間計算量はどのくらいですか?


86

配列、二分探索木、ヒープ、リンクリストなどの一般的なデータ構造の操作の時間計算量をリストしようとしています。特にJavaについて言及しています。それらは非常に一般的ですが、私たちの中には正確な答えに100%自信がない人もいると思います。どんな助け、特に参考文献も大歓迎です。

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

私は最初の答えとして私の発見/推測を投稿しています。


2
すべてのデータ構造の時間と空間の複雑さ
— BigO

1
この内ケースの他の誰かのステップでは、このリンクをチェックするために時間がかかる:infotechgems.blogspot.gr/2011/11/...
— vefthym

回答:


244

配列

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

配列リスト:

  • 追加:償却O(1)
  • 削除:O(n)
  • 含む:O(n)
  • サイズ:O(1)

リンクリスト:

  • 挿入:O(1)、先頭で実行された場合はO(n)、他の場所ではO(n)。リンクリストを直線的に移動してその位置に到達する必要があるため。
  • 削除:O(1)、先頭で実行された場合はO(n)、他の場所ではO(n)。リンクリストを直線的に移動してその位置に到達する必要があるため。
  • 検索:O(n)

二重リンクリスト:

  • 挿入:O(1)、先頭または末尾で実行された場合はO(n)、他の場所ではO(n)。リンクリストを直線的に移動してその位置に到達する必要があるため。
  • 削除:O(1)、先頭または末尾で実行された場合、他の場所で実行された場合はO(n)。リンクリストを直線的に移動してその位置に到達する必要があるため。
  • 検索:O(n)

スタック:

  • プッシュ:O(1)
  • ポップ:O(1)
  • 上:O(1)
  • 検索(特別な操作としてのルックアップのようなもの):O(n)(そうだと思います)

キュー/両端キュー/循環キュー:

  • 挿入:O(1)
  • 削除:O(1)
  • サイズ:O(1)

二分探索木:

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

赤黒木:

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

ヒープ/優先度付きキュー(最小/最大):

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

HashMap / Hashtable / HashSet:

  • 挿入/削除:O(1)償却
  • サイズ変更/ハッシュ:O(n)
  • 含まれるもの:O(1)

3
配列に要素を挿入する(そして挿入とは、新しい要素を所定の位置に追加し、すべての要素を右にシフトすることを意味します)、O(n)を取ります。削除も同様です。既存の要素を置き換えるだけでO(n)が必要になります。また、サイズ変更可能な配列に新しい要素を追加することと混合した可能性もあります(O(1)時間を償却しました)。
— Aivean 2014

また、二重リンクリストの場合、ヘッドとテールの両方に挿入および削除すると、O(1)が必要になることに注意してください(ヘッドのみについて言及しました)。
— Aivean 2014

最後に、バランスの取れた検索ツリー(たとえば、JavaのTreeMapに実際に使用される赤黒木)は、すべての操作で最悪の場合のO(ln n)を保証しています。
— Aivean 2014

@Aivean:標準のデータ構造の標準的な操作をリストしようとしています。配列の場合:追加/削除中に要素をシフトすることは標準的な操作ではありません。また、既存の要素を置き換えるには、O(n)ではなくインデックスを使用してO(1)を使用します。二重リンクリストの場合:その通りです。訂正を行っています。赤黒木について:繰り返しますが、あなたは正しいです。しかし、バランスを取る必要のないBSTだけをリストしました。そこで、赤黒木に新しいエントリを追加します。コメントありがとうございます!
— ブーシャン2014

1
@SuhailGupta:セットの複雑さはすでに最後のポイントとして与えられています。
— ブーシャン2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.