web-dev-qa-db-ja.com

ハッシュアルゴリズム:線形プローブでの要素の削除

線形プローブメソッドを使用してハッシュを実装しているときに、要素を削除すると、削除された要素の位置が廃棄済みとして宣言され、削除済みとしてマークされます。なぜすべての要素を現在の位置から次の空の要素が見つかるまでシフトできないのでしょうか。これにより、後で発生するトゥームストーンの数が多すぎて、再ハッシュが必要になる場合がある時間を節約できませんか?何か不足していますか?質問を明確にする必要があるかどうか教えてください。

どうもありがとう!

5
P Ramesh

反例によって最もよく説明される:

HASH(A) = 10
HASH(B) = 10
HASH(C) = 12

myHash.insert(A); // A goes to slot 10

              10   11   12
            +----+----+----+
            | A  |    |    |
            +----+----+----+

myHash.insert(B); // B goes to slot 10, but that is taken, so it sees 11 is empty and inserts there

              10   11   12
            +----+----+----+
            | A  | B  |    |
            +----+----+----+

myHash.insert(C); // C hashes to slot 12 and gets put there

              10   11   12
            +----+----+----+
            | A  | B  | C  |
            +----+----+----+

myHash.remove(B); // We remove B, and shift the ones after it back

              10   11   12
            +----+----+----+
            | A  | C  |    |
            +----+----+----+

myHash.contains(C) == false; // C hashes to slot 12, but there is nothing there.  So therefore the hash does not contain C (but it does CONTRADICTION).

したがって、矛盾を証明するために、削除時に後続の要素をスライドさせるだけでは不正確になります。

[〜#〜] edit [〜#〜]:Cは12にハッシュすると言っているはずです

7
Bob Fincheimer