ここでの主なアイデアは、大きな数 (または基本的には数で表さf
れる s の可能性があります) をより扱いやすい小さな数にマップする関数が必要だということです。これらの小さい数値は通常、配列内のインデックスとして直接使用されるため、によって保証される
一定のアクセス時間を取得できます。
この関数は通常、ハッシュ関数です。
ここでの問題は、大きなスペースから小さなスペースに移動するため、衝突が発生することになります (アクセス時間の保証に影響します)。
衝突に対処する方法については (使用するハッシュ関数を既に決定していると仮定して)、さまざまなアプローチがあり、そのうちの 3 つについて言及されています。 String
O(1)
HashTable
f
Linear Probing
は、空のセルが見つかるまで基本的に配列を順番に検索する最も単純な衝突解決戦略です。これを実装するのは簡単ですが、hashtable
.
要約すると、同じハッシュを持つ両方のアイテムが衝突するだけでなく、別の場所で衝突するアイテムもあるという事実により、パフォーマンスが低下します。
Quadratic Probing
Linear
元のプローブ ポイントよりもさらにセルを占有しようとすることで、改善を試みます。大幅に改善されますLinear Probing
が、二次クラスタリングが導入されます (同じハッシュ プローブを持つ要素は、配列内の同じ代替位置にもなります)。
Double Hashing
さらに改善されQuadratic Probing
、理論的には(私が思うに)線形と同じ数またはプローブを持つはずです。
二重ハッシングは最大数のプローブ シーケンスを持ち、最良の結果をもたらすようです...なぜ最大数のプローブ シーケンスが必要なのですか?
はい、理論的にはその方が良いですQuadratic
。ここで IMO が意味するのは、プローブする場所が最も離れているため、(元のバケットよりも) 別の場所にある同じハッシュまたは異なるハッシュの要素間の衝突を排除することです。