整数キーでハッシュテーブル(辞書など)
-
21-09-2019 - |
質問
私は数日間、この上で困惑してきた...私の仮定のいずれかを撃墜すること自由に感じています。
私たちは、整数キーで辞書を使用しています。私は、この場合、キーの値をハッシュとして直接使用されることを想定しています。キーハッシュの分布(キー自体と同じで、右?)ので、ハッシュテーブルのための悪い選択同様に小さな範囲内である、となると(キーが小さな範囲でのグループ化されている場合)、この平均値をしていますか?
でしょうが、素数と巧妙な何かをした、より良い分散ハッシュを計算するために数学を法されたIEqualityComparerを提供する方が良い?
解決
これを使用していないの直接の辞書には、まだそのハッシュのキーを要求されますように - しかしInt32
のハッシュ値は、の値だけのある、の推力ので、あなたの質問が関連している、はいています。
私は、.NETの辞書が機能する方法は、均一に分布されているハッシュ値に依存しないと信じています。 hash % bucketCount
は常に素数であるところそれはbucketCount
かかります。 (かかわらず、メモリからのこと - 。私は間違っている可能性が)
あなたはまだ、当然の鍵の非効率的なセットで終わることができました。彼らは独自のハッシュ値がとのテーブルがセットを維持していた場合は、すべてのキーのためにの純粋にのO(1)ハッシュテーブルしかだろう - それは常にかかわらず、ケースがされますあらゆる可能なハッシュ用バケット:)現実には、それは問題ではない傾向にあります。あなたはそれが の意志の問題であることを知ってしまった場合、[はい、カスタムIEqualityComparer<T>
は助けることができます。
他のヒント
は、標準ライブラリハッシュテーブルの実装を使用していると仮定すると、チャンスはキーは、キーはあなたが指摘することを正確に理由で、整数であっても、のないのハッシュです。
ハッシュディストリビューションについては、あなたのロジックが正しいことながらだから、整数キーは、そのハッシュ=キーを意味するであろうことを、あなたの最初の仮定は、おそらくではありません。
私は間違って再だ場合:まあ、その後.NETを。これは一般の答えの詳細です。 :)
巧妙な何かを行う前に、私は、あるとしてそれの速度をテストし、それはあなたのために適していた場合に参照してくださいね。そうでない場合は、巧妙なものを試してみてください。しかし、私はそれだけではそれを残す方が良いでしょう期待します。それは、ハッシュはない衝突やることがより重要だ、と限り、それが起こっているとして、人生は罰金になります。