2009-03-18 19 views
12

Wikipediaは言う:私のブルームフィルタにはいくつのハッシュ関数が必要ですか?

空のブルームフィルタは、mビットのビット列であり、0にすべてのセットはまた、各々がマップまたはのいずれかにいくつかのセット要素をハッシュし、異なるハッシュ関数が定義されたk個存在する必要がありますm個の配列位置は一様なランダム分布を持つ。

私は記事を読んだが、私は理解していないのはどのようにkが決定されるかである。テーブルサイズの関数ですか?

また、私が書いたハッシュテーブルでは、ハッシュのサイズを自動的に拡大する簡単で効果的なアルゴリズムを使用しました。基本的に、テーブルのバケツの50%以上が満たされた場合、テーブルのサイズを2倍にします。私はあなたが偽陽性を減らすためにまだブルームフィルターでこれをしたいと思うかもしれないと思う。正しい?

答えて

17

あなたがさらに下Wikipedia article about Bloom filtersで読む場合は、偽陽性のセクション確率を見つけます。このセクションでは、ハッシュ関数の数が偽陽性の確率にどのように影響するかを説明し、希望の予想されるprobからkを決定する式を示します。偽陽性のWikipediaの記事から


引用:

は、明らかに、M(アレイ内のビットの数 )が増加するにつれて、偽 陽性の確率が減少し、及びnは 増加(数挿入された 要素)が増加します。所与のmおよびnは ため、 確率を最小にするkの値(ハッシュの数 関数)

formula

37

は考える:

  • n:フィルタに何個のアイテムがあると思われますか? 216,553
  • p:許容可能な偽陽性率{0..1}(例:0.01→1%)

我々は計算したい:

  • m:ブルームフィルタに
  • kを必要なビット数:私たちは適用されるべきであるハッシュ関数の数を

式:

m = -n*ln(p)/(ln(2)^2)ビット数のハッシュ関数の
k = m/n * ln(2)我々の場合

  • m = -216553*ln(0.01)/(ln(2)^2) = 997263/0.48045 = 2,075,686ビット(253 KB)
  • k = m/n * ln(2) = 2075686/216553 * 0.693147 = 6.46ハッシュ関数(7つのハッシュ関数)

:パブリックドメインに解放するコード。帰属は必要ありません。

+0

ありがとうございます –

+0

対数関数の丸め/切り捨ての違いや精度のために、これらの方程式をあなたの選択した言語で実行した場合、例とまったく同じ数値が得られない場合があります。私にとっては、 'm = 2075674'と' k = 6.64'です。どちらの方法でも、両方の値を最も近い整数に切り上げ、偽陽性率は十分に近くなります。あなたの計算/丸められた 'm'と' k'の値を使って、 'p'の*実際の値を再計算する方程式を持つことは興味深いでしょう。繰り返しますが、正確な値を持つことについて心配する必要はありません。野球場は十分です。 –

+0

計算された 'm'と' k'を与えられた 'p'の実際の値を計算する方程式を見つけました - どのような丸めがあなたの受け入れ可能な偽陽性率にどのように影響したかを比較することは興味深いです。 'e'は動的定数ではなく、数学的定数です。 'p = e ^( - (m/n)*(ln(2)^ 2))' - http://stackoverflow.com/a/24071581/2609094に感謝します。 –

関連する問題