this questionに従って.Net辞書は、現在のサイズの少なくとも2倍の素数に割り振られたスペースをリサイズします。現在のサイズの2倍だけでなく、素数を使用することが重要なのはなぜですか? (私は答えを見つけるために私のgoogle - fuの力を使用しようとしましたが、役に立たない).Netディクショナリが素数にサイズ変更されるのはなぜですか?
答えて
choosing a good hashing functionに関するアルゴリズム実装の詳細であり、均一な分布を提供します。不均一な分布は、衝突の数およびそれらを解決するコストを増加させる。
素数を選択すると、一様な分布は得られません**単純化する必要はありません。 'hashsize = prime_number'を使うと、' hashsize = 2^k'や他のものと衝突する可能性はまったく同じです。ハッシュサイズによっては、衝突が「予測不可能」、「ランダム」または「一様に分布」するように見えることがあります。一方、 'hashsize = 2^k'とすると、xorに基づく任意のハッシュ関数が吸うことになります。 –
これは素数の数学のためです。彼らは異なる小さな数字に因数分解することはできません。保存されたアイテムからハッシュ番号を分割すると、均等な分布が得られます。オブジェクトに応じて素数を持たない場合、分布は均一ではない可能性があります。
要素が配置されるバケットは、(hash & 0x7FFFFFF) % capacity
によって決まります。これは、一様に分散する必要があります。このことから、base
とcapacity
が互いに素でない(最大公約数> 1)特定の基底(hash1 = x1 * base
、hash2 = x2 * base
、...)の倍数である複数のエントリが使用され、いくつかのスロットが過度に使用され、中古。素数はそれ自身を除いて任意の数になるので、良い分布を達成する可能性は比較的高い。
これの特に優れた特性は、capacity > 30
の場合、各ビットのハッシュコードへの寄与が異なることです。したがって、ハッシュのバリエーションがほんの数ビットに集中すると、それでも良好な分布につながります。これは、なぜ2のべき乗である容量が悪いのかを説明します。高いビットをマスクします。上位ビットだけが異なる数の集合はそうは考えにくい。
個人的に私は彼らがその機能をひどく選ぶと思います。これには高価なモジュロ演算が含まれており、エントリが素数の倍数であればその性能は低下します。しかし、それはほとんどのアプリケーションにとって十分であるようです。
あなたの疑問にお答えしますが、プライムサイズにリサイズするツリー状のバランスのとれたデータ構造を知っている人はいますか? 多分私は別の質問を投稿する必要があります –
.Netの辞書の背後にあるツリーデータ構造は何ですか? –
私はここで質問をしました。http://stackoverflow.com/questions/4639122/balanced-tree-like-data-structure-that-resizes-to-prime-sizes –