web-dev-qa-db-ja.com

ハッシュマップまたはハッシュテーブルでの再ハッシュプロセス

サイズがmaxthreshold値を超えた場合、ハッシュマップまたはハッシュテーブルで再ハッシュプロセスはどのように行われますか?

すべてのペアがバケットの新しい配列にコピーされるだけですか?

編集:

再ハッシュ後、(リンクされたリスト内の)同じバケット内の要素はどうなりますか?つまり、リハッシュ後も同じバケットに残りますか?

17
a Learner

問題の最大しきい値は、負荷率と呼ばれます。

負荷係数を約0.75にすることをお勧めします。負荷係数は(m/n)として定義されます。ここで、nはハッシュテーブルの合計サイズであり、mは、基になるデータ構造のサイズの増加が必要になる前に挿入できるエントリの推奨数です。

再ハッシュは次の2つの場合に実行できます。

  1. 現在のm/n比が負荷係数を超えて増加した場合

  2. M '/ n比が非常に低い値、たとえば0.1に落ちる

どちらの場合も、m 'は現在のエントリ数です。また、どちらの場合も、現在のエントリを大きなハッシュテーブルまたは小さなハッシュテーブルにシフトする必要があります。

問題のコンテキストでは、リハッシュとは、ハッシュ関数をエントリに適用して、エントリを別のハッシュテーブルに移動するプロセスです。以前に使用したハッシュ関数を使用することも、新しい関数をすべて使用することもできます。

注意:衝突が発生した場合にもリハッシュが行われます。 (これは衝突を処理する方法でもあります。)

さらにコンテキストと詳細なディスカッションを追加するには、私のブログにアクセスしてください Hashing Basics

19
dharam

ハッシュマップの再ハッシュは、マップ内の要素の数が最大しきい値に達したときに行われます。

通常、負荷係数値は0.75で、デフォルトの初期容量値は16です。要素の数が容量の0.75倍に達するかそれを超えると、マップの再ハッシュが行われます。この場合、要素数が12のとき、リハッシュが発生します。 (0.75 * 16 = 12)

再ハッシュが発生すると、新しいハッシュ関数または同じハッシュ関数を使用できますが、値が存在するバケットは変更される可能性があります。基本的に、再ハッシュが発生すると、バケットの数が約2倍になるため、値を配置する必要がある新しいインデックスが変更されます。

再ハッシュ中、各バケットのリンクリストは順番が逆になります。これは、HashMapが新しい要素を末尾に追加せず、新しい要素を先頭に追加するために発生します。したがって、再ハッシュが発生すると、各要素を読み取り、それを新しいバケットの先頭に挿入してから、新しいマップの先頭にある古いマップから次の要素を追加し続け、リンクされたリストを逆にします。

同じハッシュマップを処理する複数のスレッドがある場合、無限ループになる可能性があります。

上記の場合に無限ループがどのように発生するかを説明する詳細な説明は、ここにあります: http://mailinator.blogspot.hu/2009/06/beautiful-race-condition.html

マップに挿入された要素をキーに対してソートする必要がある場合は、TreeMapを使用できます。ただし、キーの順序が重要でない場合は、HashMapの方が効率的です。

14
Melwin

ハッシュ–再ハッシュと競合状態

基本的に、ハッシュマップの作成中に、コレクションはデフォルトの容量(2 ^ 4、つまり16.)を割り当てます。要素がマップに追加された後の段階で、特定の段階の後、最初に定義された容量に近づいたら、パフォーマンスを維持するためにReHashingの要件があります。

コレクションに定義されたLoadFactor(0.75といいます)があり、これは時間と空間の適切なインデックスを指定します。

  • 負荷係数が大きい=>スペース消費は少ないが、ルックアップが多い
  • SMALLER負荷係数=>必要な要素数に比べてより多くのスペース消費。

Java仕様では、良好な負荷係数の値は.75であることが推奨されています

したがって、10個の要素をハッシュに格納する最大要件があるとします。次に、Good Loadfactorを検討します。75=コレクションに7個の要素を追加すると、再ハッシュが発生します。この場合、要件が7にならない場合、リハッシュは発生しません。

ハッシュマップに格納される要素が本当に大きい場合は、十分な容量のHashMapを作成することをお勧めします。これは、自動リハッシュを実行させるよりも効率的です。

RACE条件:指定されたバケットのリンクリストに格納されている内部要素のリハッシュを実行しているとき。それらは順番が逆になります。 2つのスレッドが同時に競合状態に遭遇したとすると、順序が変更されているため、トラバース中に2番目のtheradが無限ループに入る可能性があります。

10
Manjul