3

割り当てのために、私は一般的なハッシュテーブルのコードを書かなければなりません。Putメソッドの例では、次の2行があります。

int hash = key.hashCode(); // get the hashcode of the key
int index = compress(hash); // compress it to an index

hashCodeメソッドがキーを使用してインデックスを返すことを理解していました。そのインデックスの配列にキーと値のペアを配置します。ただし、ここではハッシュコードを「圧縮」してインデックスを取得します。この方法は何をしますか?ハッシュコードをどのように「圧縮」しますか?それは必要および/または好ましいですか?

4

2 に答える 2

5

ハッシュコードは、 -231から231-1までの任意の整数にすることができます。これは、約40億の異なる可能なハッシュコードです。たとえば、40個のハッシュテーブルバケットがある場合は、それらの40億個の整数を0〜39の範囲に「圧縮」する必要があります。

これを行う一般的な方法は、モジュラス演算子を使用すること%です。a % bで割った余りを返しaますb。たとえば、7 % 3 == 1

int compress(int hash) {
    return hash % numBuckets;
}

注:これはすべての言語に当てはまるわけではありませんが、Javaでは、結果の符号は被除数の符号と等しくなります。つまり、上記の計算結果は常に負ではありません。CおよびC++では、これは当てはまりません(符号は実装定義です)。したがって、負のハッシュ値を正しく処理するために特別な注意を払う必要があります。

各プログラミング言語がモジュラスの符号を処理する方法の内訳については、Wikipediaのさまざまなプログラミング言語の整数モジュロ演算子を参照してください。

于 2012-10-02T03:36:57.710 に答える
0

また、負のハッシュコードを使用することもできますが、必要なのはゼロ以上の有効なインデックスです。compressは、モジュラス演算子を適用する前に、ハッシュコードでabs()を取得します。

于 2012-10-02T03:40:58.477 に答える