整数のコレクション(つまり、マルチセット)に、理論的に十分な保証があるハッシュ関数はありますか?


36

理想的には、次のプロパティを持つ整数のマルチセットのハッシュを保存する方法があるかどうか興味があります。

  1. O(1)スペースを使用します
  2. O(1)時間での挿入または削除を反映するように更新できます
  3. 2つの同一のコレクション(つまり、同じ多重度を持つ同じ要素を持つコレクション)は常に同じ値にハッシュする必要があり、2つの異なるコレクションは高い値で異なる値にハッシュする必要があります(つまり、関数は独立またはペア独立です)

これの最初の試みは、個々の要素のハッシュのランダムな素数を法として積を格納することです。これは1と2を満たしますが、それまたは密接なバリエーションが3を満足するかどうかは明らかではありません。

最初にこれをStackOverflowに投稿しました。

*プロパティ1と2は、たとえばO(log n)または小さな部分線形多項式に少し緩和することができます。ポイントは、複数のセットを識別し、要素自体を保存せずに同等性を確実にテストできるかどうかを確認することです。


マルチセットの表現は何ですか?すなわち、マルチセットをビット文字列としてどのようにエンコードしますか?時間操作(マルチセットのサイズとは無関係を本当に取得したい場合は、エンコーディングを明示的にする必要があると思います。O(1)
ユッカスオメラ

セットのエンコードは重要ではありません。ハッシュ関数は、セットの表現から独立している必要があります。ハッシュセットの正規表現を使用していた場合、セットのビット表現の標準ハッシュは3を満たし、おそらく1を満たしますが、2を満たしません。2つの等しいコレクションは常に同じ値にハッシュする必要があることを追加する必要があります。
ジョンデリー

2とはどういう意味ですか?古いセット、古いハッシュコード、および新しい要素を取得し、新しいハッシュコードを計算しますか?または、古いハッシュコードと新しい要素だけを取得しますか?
ミハイ

理想的には、古いセットは必要ありません。おそらくフォールスポジティブの可能性が低いハッシュ値を比較することにより、メンバークエリ(スペース制限を考慮すると重要)を実行する必要はなく、単に同等性テストを実行する必要さえありません。
ジョンデリー

回答:


17

セットを宇宙に住んでいると考えている場合、更新時間で問題を解決するのは非常に簡単です。必要なのは、高速な「ローカル更新」を伴う数のベクトルに対する高速ハッシュ関数だけです。O lg u u[u]O(lgu)u

Wikipedia / Universal hashingは、。ここで、は十分に大きい素数でから一様に描かれます。あなたが追加または削除要素とき、あなたが追加する必要が/減算とるハッシュコードから累乗のための分割統治を使用して時間を。次数多項式は根しか持つことができないため、2つの異なるセットの衝突確率はです。これは取って非常に小さくすることができる十分な大きさであることを(例えば、 p a [ p ] i a i O lg i u u O u / p p p = u 2 [ u ]h(x)=(i=1uxiai)modppa[p]iaiO(lgi)uuO(u/p)pp=u2「倍精度」で作業します)。セットがよりもはるかに小さい場合、もちろんユニバースをより小さなユニバースにハッシュすることから始めることができます。[u]

誰かが範囲にハッシュするときの衝突確率の解を知っていますか?これは可能であるべきです。[ p ]O(1/p)[p]


0

カーターとウェグマンは、これを新しいハッシュ関数と認証での使用とセットの平等でカバーしています。それはあなたが説明するものと非常に似ています。基本的に、可換ハッシュ関数は、O(1)での挿入と削除、および高確率一致のために、一度に1つの要素を更新できます。


これは、セットでのみ機能し、マルチセットでは機能しないと思います(質問が尋ねたように)。ページ274の下部のセクション5から:「ADD(x、S)-要素xをSという名前のセットに追加します。xがすでにSのメンバーである場合、この操作は使用できません。」
jbapple

あなたが正しい; 「マルチ」部分を見逃しました。ハッシュ関数は重複を処理できる可能性がありますが、引用はありません。
-KWillets

-2

ハッシュ関数の品質は、ハッシュする必要がある要素のプロパティに常に依存します。これについて何か言えますか?たとえば、マルチセットの要素x_iに通常は多くの小さな素因数がある場合、製品の提案はおそらく不十分なハッシュ関数です。しかし、この場合、いくつかの素数pとqに対してすべてのx_i + p mod qの積を取るだけで、それを改善できます。


1
はい、それが個々の要素のハッシュを取得してからそれらを乗算する理由です。
ジョンデリー

何?OPの提案は、単にそれらをすべて一緒に増やすことです。これを行う前にそれぞれに定数を追加すると、おそらくより良いハッシュが得られると言っています。
トニーK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

合計により、同じ値の複数のオカレンスを持つことが
でき、xorにより、合計が同じ量になるセットを持つことができます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.