ハッシュテーブルのサイズ変更時にサイズ変更のカスケードを回避するにはどうすればよいですか?


8

個別のチェーンや線形/二次プローブなどの従来の衝突解決方法では、キーのプローブシーケンスを任意に長くすることができます。テーブルの負荷係数を低く維持することで、キーの確率を短くして、高い確率で維持できます。したがって、再ハッシュ中の衝突は負荷率に影響を与えないため、問題にはなりません。

ただし、カッコウハッシュ(および最悪の場合のO(1)ルックアップ時間を提供する他の方法)では、キーのプローブシーケンスが長くなりすぎると、サイズ変更発生する必要があります。しかし、リハッシュ中にキーがシャッフルされると、1つのキーに対して長すぎるプローブシーケンスが作成され、別のサイズ変更が必要になる場合があります。確率は小さいですが、特に優れたハッシュ関数を使用すると、確率は低くなります。

再ハッシュ中に完全なハッシュ関数を明示的に生成するのではなく、この方法でサイズ変更をカスケードできないようにする方法はありますか?おそらく特定の衝突解決スキームに固有ですか?これまでに出会った文献は、問題を完全に覆い隠しているようです。ハッシュテーブルを成長させるだけでなく、縮小することにも興味があることを覚えておいてください。

回答:


1

あなたはカスケードの再ハッシュを回避する方法を尋ねますが、あなたの投稿ですでに答えを出しました。悪いイベントが発生する確率を低く抑えます。

カッコウハッシュについて言及しました。プローブシーケンスが長くなる確率はです。したがって、リハッシュすると、n個の要素が最初から挿入されます。再ハッシュが成功しない確率はO 1 / n なので、非常に高い確率で成功します。予想では、一定の試行回数のみが必要です。再ハッシュに問題があることがわかった場合は、テーブルサイズを増やして負荷係数を変更する必要があります。あるいは、ハッシュ関数のより良いファミリを選択できます。O1/2O1/


-1

線形ハッシュに触発された1つの解決策があると思います。

ハッシュ関数が一定に保たれている場合(つまり、サイズを変更しても変更されない)、テーブルが常にスロットを2倍にすることで拡張される場合、テーブルが拡張された後、

Hモッド2L={HモッドL+LまたはHモッドL

ここで、はキーのハッシュ、Lは古いスロット数です。これは、キーが空のままであるか、新しく割り当てられた領域の一意のスロットにキーが移動することを意味します。HL

これを(d-ary)カッコウハッシュに適用するには、各サブテーブルのサイズを個別に変更し、サブテーブル間でキーを移動しないでください。

{HモッドL2+L2 HモッドL2}HモッドL2O


これが機能するかどうかはわかりません。ハッシュ関数がh(x)= cの場合、定数cについてはどうでしょうか?
jbapple 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.