0

スパース2次元データセットの一部としてハッシュテーブル(DotNETディクショナリオブジェクト)を使用しています。ハッシュテーブルのほとんどのエントリは互いに接近しています。おそらく100〜10,000のエントリになり、それらはすべてゼロ近くにクラスター化されます。ハッシュが整数(32ビット)の範囲全体に分散していると、ハッシュテーブルのパフォーマンスが向上することを読みました。

連続する整数を1:1の方法で大きく異なる値にマッピングする安価な方法はありますか?それらをマップし直す必要はありません。それは純粋に一方向のことです。

4

3 に答える 3

3

たぶん私はあなたが言っていることを誤解していますが、辞書はすでにあなたの整数をハッシュします。それらを事前にハッシュする必要はありません。おそらく無意味な事前最適化を試みる代わりに、デフォルトの実装を試してみて、それがどのように行われるかを見てみませんか。

于 2009-09-19T06:03:51.207 に答える
1

キーセットの最大値(kmax)がわかっている場合は、定数係数(乗数)で拡張できます。たとえば、積を最大整数サイズ(2 ^ 31-1)未満に保つ固定素数を掛けます。

つまり、最も近い素数(2^30) / kmax

:使用するプライムがハッシュテーブルのバケット数と同じでないことを確認してください。

別の解決策は次のとおりです。.NETRandomクラスは同じシードに対して同じ値を生成するため、これを使用して着信キーを配布できます。

于 2009-09-19T05:17:23.827 に答える
1

Integerを使用する代わりに、Integerから継承するクラスを記述し、GetHashCode関数をオーバーライドします。このようにして、この関数を作成する以外に何もする必要はありません。

値を均等に分散するために私が考えることができる最も簡単な方法は、次のようなことを行うことです。

public class MyInteger:Integer
{
    public override int GetHashCode()
    {
       unchecked
       {
           return (int)Math.Pow(this,this);
       }
    }
}

労力を最小限に抑えながら、素晴らしく均等に分割します。

于 2009-09-19T05:24:29.397 に答える