ハッシュテーブルが償却されるという話は、過度に単純化した嘘です。 Θ(1)
場合にのみ真である:
-アイテムごとのハッシュへのデータの量が数と比較して自明であるKの EYSとハッシュの速度Kの EYは速い-。
-多くのCの ollisionsが小さい-。
-私たちは、ないではないに必要なアカウントの時間を考慮するRハッシュテーブルをESIZE - Rを。ck
c
r
ハッシュする大きな文字列
最初の仮定がfalseの場合、実行時間はまで増加します。
これは確かに大きな文字列にも当てはまりますが、大きな文字列の場合、単純な比較ではΘ (k )の実行時間になります。したがって、ハッシュは漸近的に遅くなるわけではありませんが、比較は初期のオプトアウトergo O (1 )、Ω (k )を持ち、ハッシュは常に完全な文字列O (k )をハッシュする必要があるため、ハッシュは常に単純な比較よりも遅くなります。Ω (k )Θ(k)
Θ(k)O(1)Ω(k)O(k)Ω(k)。
整数は非常にゆっくりと増加することに注意してください。8バイトは最大値を格納できます。8バイトは、ハッシュに取るに足らない量です。
bigintを保存したい場合は、それらを文字列と考えてください。 1018
スローハッシュアルゴリズムハッシュに
費やす金額がデータのストレージと比較して重要な場合、明らかに仮定は受け入れられなくなります。
暗号化ハッシュを使用しない限り、これは問題にはなりません。Θ(1)
重要なのはそれである> > K。それが保持している限りとしてΘ (1 )公正な文です。n >> kΘ(1)
多くの衝突
ハッシュ関数が貧弱な場合、またはハッシュテーブルが小さい場合、またはハッシュテーブルのサイズが不自然な場合、衝突が頻繁に発生し、実行時間がます。
ハッシュ関数は、低速のハッシュを犠牲にして衝突の数を減らすことを疑う場合に、可能な限り高速でありながら衝突がまれになるように選択する必要があります。
経験則では、ハッシュテーブルの使用率は常に75%未満である必要があります。
また、ハッシュテーブルのサイズは、ハッシュ関数と相関関係があってはなりません。
多くの場合、ハッシュテーブルのサイズは(比較的)素数です。 O(log(n))
ハッシュテーブルのサイズ変更
ほぼ完全なハッシュテーブルでは衝突が多すぎ、大きな(空の)ハッシュテーブルはスペースの無駄になるため、多くの実装では、必要に応じてハッシュテーブルを拡大(および縮小)できます。
パフォーマンス上の理由からストレージを継続する必要があるため、テーブルの拡大には、すべてのアイテムの完全なコピー(および場合によっては再シャッフル)が含まれる可能性があります。
病理学的な場合にのみ、ハッシュテーブルのサイズ変更が問題になるため、(コストはかかりますがまれに)サイズ変更は多くの呼び出しにわたって償却されます。
実行時間
したがって、ハッシュテーブルの実際の実行時間はです。平均
でk、c、rのそれぞれは、償却実行時間の(小さい)定数であると想定されるため、Θ (1 )は公平なステートメントであると言えます。 Θ(kcr)
kcrΘ(1)
質問に戻るには、言い訳を失礼に失礼します。
意味の異なるセットを抽出しようとしましたが、いくつか見逃した場合はコメントしてください
ハッシュ関数の出力の長さが気になるようです。これをとしましょう(nは通常、ハッシュするアイテムの数と見なされます)。mはハッシュテーブルのエントリを一意に識別する必要があるため、l o g (n )になります。
これは、mの成長が非常に遅いことを意味します。64ビットでは、ハッシュテーブルエントリの数が、世界中で利用可能なRAMのかなりの部分を占めます。128ビットでは、地球上で利用可能なディスクストレージをはるかに超えます。
128ビットハッシュの生成は32ビットハッシュよりも難しくないので、いいえ、ハッシュを作成する時間はO (mnmlog(n)
(または、 O (l o g (n )))。 O(m)O(log(n))
要素のビットを通過するハッシュ関数は、時間かかります。 log(n)Θ(log(n))
しかし、ハッシュ関数は要素のビットを通過しません。
1アイテム(!!)ごとにデータのみを通過します。
また、入力の長さ(k)は要素の数とは関係ありません。これは重要です。一部の非ハッシュアルゴリズムでは、コレクション内の多くの要素を調べて(一致しない)一致する要素を見つける必要があるためです。
ハッシュテーブルは、結論に達する前に、平均して検討中の項目ごとに1つまたは2つの比較のみを実行します。 log(n)
O(k)
なぜハッシュテーブルは可変長要素を格納するのに効率的ですか?
入力の長さ()に関係なく、出力の長さ()は常に同じであるため、衝突はまれであり、ルックアップ時間は一定です。
ただし、キーの長さがハッシュテーブル内のアイテム数()に比べて大きくなると、ストーリーは変化します...km
kn
ハッシュテーブルはなぜ大きな文字列を格納するのに効率的ですか?
ハッシュテーブルは、非常に大きな文字列に対してはあまり効率的ではありません。
場合(つまり、入力のサイズがハッシュテーブルの項目数と比べてかなり大きい場合)、ハッシュの実行時間が一定であるとは言えませんが、実行時間に切り替える必要があります特に早期終了がないためです。完全なキーをハッシュする必要があります。限られた数のアイテムのみを保存する場合は、ソートされたストレージを使用する方がはるかに良いでしょうを比較すると、違いが見られ次第、オプトアウトできます。 not n>>kΘ(k)k1 ≠ k2
ただし、データがわかっている場合は、キー全体をハッシュするのではなく、(既知または想定される)揮発性部分のみをハッシュして、衝突をチェックしながらプロパティを復元することを選択できます。 Θ(1)
非表示の定数
誰もが知っておくべきことですが、は、処理される要素ごとの時間が一定であることを単に意味します。この定数は、単純な比較よりもハッシュの方がかなり大きいです。
小さなテーブルの場合、たとえば10のバイナリ比較は単一のハッシュよりも高速になる可能性があるため、バイナリ検索はハッシュルックアップよりも高速になります。
小さなデータセットの場合、ハッシュテーブルの代替を検討する必要があります。
ハッシュテーブルが本当に優れているのは、大規模なデータセットにあります。Θ(1)