包含テスト用の整数のハッシュセット


10

AがBに含まれている場合、R(H(A)、H(B))になるようなセットH(。)および関係R(。、。)のハッシュ関数を探しています。もちろん、R(。、。)は検証が容易(一定時間)でなければならず、H(A)は線形時間で計算する必要があります。

HとRの一例は次のとおりです。

  • H(A)=xA1<<(h(x)modk)、ここでkは固定整数、h(x)は整数に対するハッシュ関数です。
  • R(H(A)、H(B))=((H(A)&H(B))== H(A))

他に良い例はありますか?(良い定義は難しいですが、R(H(A)、H(B))であれば直感的に、whp AがBに含まれます)。

後で編集

  1. ハッシュ関数のファミリーを探しています。私はたくさんのセットを持っています。各セットに3〜8個の要素。それらの90%は3つまたは4つの要素を持っています。私が挙げたハッシュ関数の例は、このケースではあまりよく分散されていません。
  2. H(。)(この例ではk)のビット数は小さくなければなりません(つまり、H(。)は整数または長さに収まる必要があります)。
  3. Rの1つの優れた特性は、H(。)にkビットがある場合、R(。、。)が(3 ^ k-2 ^ k)/ 4 ^ kペアに対して真であることです。非常に少数のペア。
  4. ブルームフィルターは、大規模なセットに特に適しています。この問題にBFを使用してみましたが、最適な結果は1つの関数のみでした。

stackoverflowからのクロスポスト、十分な回答が得られませんでした)


何を「うん」入力が特定の分布からのものであると思いますか?
Jukka Suomela、2009

また、ハッシュ関数のファミリーではなく、単一の固定ハッシュ関数を本当に探していますか?
Jukka Suomela、2009

@Jukka:私は彼がR(H(A)、H(B))である場合、AがBのサブセットであると高い確率で結論付けていると思います。確率は、AとBのランダムな選択と、 HとR(ある場合)の内部コイントス。
MS Dousti 2010

ハッシュ関数のファミリーを探しています。私のセットは小さい傾向があります(それぞれ3から8要素、それらの90%は3または4要素を持っている)ので、私が与えたハッシュ関数の例はあまりよく分散されていません。
Alexandru

Rの1つの優れた特性は、H(。)にnビットがある場合、R(。、。)が(3 ^ n-2 ^ n)/ 4 ^ nペアに対して真であることです。非常に少数のペア。
Alexandru

回答:


10

(この回答は元々コメントにありましたが、Sureshの提案で別の回答に移動します。)

非常に小さなセットを使用するアプリケーションの場合、ブルームハッシュ関数の数を非常に大きくして、誤検知の数を最小限に抑える必要があります。計算時間を節約するために、ブルームフィルターの次のバリエーションをお勧めします。それぞれがビットの文字列を生成する要素に対して、3つの従来のハッシュ関数、、があるとします。各要素をビット単位およびこれら3つのハッシュ関数にハッシュします。結果の要素のハッシュは約H 1 、H 2 、H 3 m個2 - 3 = 1 / 8 のT Hkh1h2h3m23=1/8thもの。各セットをビット単位またはその構成要素のハッシュにハッシュします。セットには3〜8個の要素があるため、結果のハッシュは半分のハッシュに近くなります。これは、おそらく誤検知率を低く抑えたいものです。

上記のスキームの違いは、従来のブルームフィルターが従来の Erdos ランダムグラフモデルとランダム正規グラフの違いに類似していることです。上記のスキームでは、ブルームハッシュの有効数がその平均値前後で少し異なりますが、はかなり大きいため、この違いは問題になりません。 d k m / 8 m / 8Gn,pdkm/8m/8


これは、提案したとおり、大きなm(32または64)に特に適しています。
Alexandru

4

あなたの提案と同じ関係のハッシュとしてBloomフィルターを使用してみます。アプリケーションに最適なフィルターサイズとハッシュ関数の数を計算することは、それほど難しくありません。インスピレーションについては、WikipediaのBloom Filterの記事を参照してください。誤検知を回避したい度合いによっては、やようなもので十分かもしれません。kmkk = 4m=64k=4


非常に小さなセットを使用するアプリケーションの場合、かなり大きくする必要があります。これは、従来のアプローチではかなり遅い場合があります。代わりに次のことをお勧めします。k
ウォーレンシュディ

(前のコメントの続き)これは本質的にブルームフィルターのバリエーションです。ビットの文字列を生成する要素に対して、3つのハッシュ関数、、があるとします。要素をビット単位で、これら3つのうちの1つにハッシュします。結果のハッシュは約1/8番目の1になります。セットをその構成要素のビット単位またはハッシュにハッシュします。セットには3〜8個の要素があるため、結果として得られるハッシュは半数のハッシュに相当し、偽陽性率を抑えるのに役立つ可能性があります。時間2 時間3h1h2h3m
ウォーレンシュディ

このバリエーションの利点は、ほとんどのコンピューターが持つ操作という言葉に固有の並列処理をより有効に利用できることだけです。
ウォーレンシュディ

ウォレン、これを回答として投稿してください。それはいくつかの投票に値します
Suresh Venkat

2
@ウォーレン、@シュレッシュ:これら2つの密接に関連する回答を組み合わせてから、コメントを削除する方が理にかなっていると思います。特に答えの1つが他で定義されたパラメーターを参照しているので、従う方が簡単です。
Jukka Suomela、2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.