質問:
効率的に使用され、値を頻繁に再配置する必要がない場合に、ハッシュテーブルの値はどのようにメモリに格納されますか?
私の現在の理解(間違っている可能性があります):
ハッシュテーブルに3つのオブジェクトが格納されているとしましょう。それらのハッシュ関数はこれらの値を生成します:
- 0
- 10
- 20
これらのオブジェクトのポインタは、次のメモリアドレスに格納されません。これらのオブジェクト間には大きなギャップがあるためです。
- startOfHashTable + 0
- startOfHashTable + 10
- startOfHashTable + 20
ハッシュテーブル上のWikipediaの記事は、「インデックス」とは、のように計算されていることを述べています:
hash = hashfunc(key)
index = hash % array_size
したがって、私の例では、インデックスは次のようになります。
- 0%3 = 0
- 10%3 = 1
- 20%3 = 2
これにより、前述の大きなギャップが解消されます。このモジュロスキームを使用しても、ハッシュテーブルにさらにオブジェクトを追加すると問題が発生します。ハッシュテーブルに4番目のオブジェクトを追加すると、インデックスを取得するために%4を適用する必要があります。これで、過去に行った%3はすべて無効になりませんか?以前の%3のすべてを%4の場所に再配置する必要がありますか?
hash % table size
ハッシュではなく、均一に分散されると言う方が良いでしょう。自体。