web-dev-qa-db-ja.com

ハッシュテーブルの時間の複雑さ

ハッシュテーブルの時間の複雑さについて混乱しています。多くの記事は、「償却O(1)」ではなく、実際の順序O(1)実際のアプリケーションで何を意味するのか。理論上ではなく実際の実装でのハッシュテーブル内の操作の平均時間の複雑さ、および操作が真ではないのはなぜですかO(1)?

37
marme

ハッシュ関数を使用して衝突が発生する回数や、サイズ変更が必要なことなどを事前に知ることは不可能です。これにより、予測不可能な要素がハッシュテーブルのパフォーマンスに追加され、O(1)ではないことがあります。ただし、実質的にすべてのハッシュテーブルの実装は、挿入の広大な広大な大部分でO(1)を提供します。これは配列の挿入と同じです-O(1)。その場合、O(n)と衝突の不確実性が追加されます。

現実には、ハッシュの衝突は非常にまれであり、これらの詳細を心配する必要がある唯一の条件は、特定のコードが実行する必要がある非常に厳しい時間枠を持っている場合です。ほぼすべてのユースケースで、ハッシュテーブルはO(1)です。 O(1)挿入よりも印象的ですO(1)検索。

21
Puppy

ハッシュテーブルの一部の使用では、テーブルの有効期間中に同時に保持する必要のある要素の数がわからないため、「適切な」サイズのハッシュテーブルを事前に作成することはできません。高速アクセスを維持したい場合は、要素の数が増えるにつれてテーブルのサイズを変更する必要があります。このサイズ変更は、既にテーブルにある要素の数に対して線形の時間を要し、通常、要素の数がしきい値を超えたときに挿入時に行われます。

これらのサイズ変更操作は、挿入の償却コストがまだ一定であるほどにはほとんど行われません(たとえば、サイズ変更のたびにサイズを2倍にするなど、テーブルのサイズの幾何学的な進行に従って)。ただし、サイズの変更をトリガーするため、時々1回の挿入にO(n)時間がかかります。

実際には、ハードリアルタイムアプリケーションを構築しているのでなければ、これは問題になりません。

7
Pascal Cuoq

ハッシュテーブルに値を挿入する、平均的なケースでは、O(1) time。ハッシュ関数が計算され、ハッシュテーブルからバックが選択され、アイテムが挿入されます。最悪の場合のシナリオでは、すべての要素が同じ値にハッシュされます。つまり、バケットリスト全体をトラバースするか、オープンアドレス指定の場合はテーブル全体をトラバースする必要があります。空のスポットが見つかるまでプローブされます。したがって、最悪の場合、挿入にはO(n) timeかかります

参照: http://www.cs.unc.edu/~plaisted/comp550/Neyer%20paper.pdf (ハッシュテーブルセクション)

2
Rohit Jain