8

私はこれについて数日間困惑してきました...私の仮定を自由に打ち負かしてください.

整数キーを持つ Dictionary を使用しています。この場合のキーの値は、ハッシュとして直接使用されると想定しています。これは (キーが狭い範囲でグループ化されている場合)、キー ハッシュ (キー自体と同じですよね?) の分布が同様に狭い範囲になることを意味するので、ハッシュテーブルの選択は不適切でしょうか?

より優れた分散ハッシュを計算するために、素数とモジュロ数学を巧妙に処理する IEqualityComparer を提供する方がよいでしょうか?

4

3 に答える 3

8

辞書は引き続きハッシュのキーを要求するという点で直接使用されませんが、のハッシュ値Int32 単なる値であるため、質問の推力は関連しています。

私は、.NET ディクショナリが機能する方法は、ハッシュ値が均一に分散されていることに依存していないと考えています。常に素数のhash % bucketCount場所がかかります。bucketCount(これは記憶によるものですが、間違っている可能性があります。)

もちろん、バケツ数だけ間隔が開いていると、非効率的なキーのセットになってしまう可能性があります。ただし、それは常に当てはまります-ハッシュテーブルは、一意のハッシュ値があり、テーブルが可能なすべてのハッシュのバケットのセットを維持している場合、すべてのキーに対して真にO(1) になるだけです:)実際にはそうではない傾向があります問題。それが問題になることがわかっている場合は、はい、カスタムが役立つ可能性があります.IEqualityComparer<T>

于 2009-09-07T08:57:55.770 に答える
1

何か賢いことをする前に、私はそれの速度をそのままテストし、それがあなたに適しているかどうかを確認します。そうでない場合は、賢いことを試してください。しかし、私はそれを放っておく方が良いと思います。ハッシュが衝突しないことがより重要であり、それが起こっている限り、人生は大丈夫です。

于 2009-09-07T09:02:15.113 に答える
0

標準ライブラリのハッシュテーブルの実装を使用していると仮定すると、キーが整数であっても、指摘した理由から、キーがハッシュではない可能性があります。

したがって、ハッシュ分布に関するロジックは正しいものの、整数キーはハッシュ=キーを意味するという最初の仮定はおそらくそうではありません。

私が間違っている場合:.NETそれならまあ; これはもっと一般的な答えです。:)

于 2009-09-07T08:58:25.957 に答える