スケーラブルブルームフィルターを読んでいて、構成ブルームフィルターがいっぱいになるたびに、より大きなサイズの新しいブルームフィルターが追加される方法を理解できませんでした。
最初に作成されたフィルターの設定ビットに寄与した要素は、存在を検索できません。おそらく私はこれを理解していないのでしょうか?
基本的なブルームフィルターは理解できます。ただし、動的ブルームフィルターに頭を包むことはできません。
スケーラブルブルームフィルターを読んでいて、構成ブルームフィルターがいっぱいになるたびに、より大きなサイズの新しいブルームフィルターが追加される方法を理解できませんでした。
最初に作成されたフィルターの設定ビットに寄与した要素は、存在を検索できません。おそらく私はこれを理解していないのでしょうか?
基本的なブルームフィルターは理解できます。ただし、動的ブルームフィルターに頭を包むことはできません。
回答:
これを撃って、どれだけ屠殺できるか試してみましょう。:-)
そのため、最初に、誤検出の最大確率で有限数の要素を許可する通常のブルームフィルターを作成できる必要があります。スケーラブルな実装を構築する前に、これらの機能を基本フィルターに追加する必要があります。
確率が何であるかを制御および最適化する前に、特定のブルームフィルターサイズの確率が何であるかを把握しましょう。
最初に、ビットフィールドをハッシュ関数の数(合計ビット数/ハッシュ関数の数=スライス)で分割し、各ハッシュ関数を表すビットのkスライスを取得して、すべての要素が常にkビットで記述されるようにします。
スライス数またはスライスあたりのビット数を増やすと、誤検知の確率が低下します。
また、要素が追加されると、より多くのビットが1に設定されるため、誤検知が増加します。これを各スライスの「充填率」と呼びます。
フィルターが大量のデータを保持している場合、このフィルターの誤検知の可能性は、スライスの数まで増加した充填率であると想定できます(比率を使用する代わりに実際にビットをカウントする場合、これは繰り返し問題のある順列)。
それでは、ブルームフィルターで偽陽性の確率を選択する方法をどのように把握するのでしょうか。スライスの数を変更することができます(これは塗りつぶし率に影響します)。
必要なスライス数を把握するために、スライスの最適な充填率を把握することから始めます。充填率はスライスのビット数1と0のビット数によって決定されるため、各ビットは(100%-(1 /スライスのビット)の確率で未設定のままになると判断できます。 )。複数のアイテムを挿入するので、レピュテーションの問題を伴う別の順列があり、予想される充足率(100%-((100%-(1 /スライス内のビット))^ 「挿入された要素」))。まあ、これは別の方程式に非常に似ていることがわかります。論文では、充填率を別の方程式に関連付けているため、テイラー級数(1-e ^(-n / m))にうまく適合します。これに少し手を加えた後、最適な充填率は常に約50%であることがわかりました。
そのため、フィルターの確率はスライス数に比例した充填率であるため、50%を充填してP =(50%)^ kまたはk = log_2(1 / P)を取得できます。次に、この関数を使用して、スケーラブルブルームフィルターのフィルターのリスト内の特定のフィルターに対して生成するスライスの数を計算できます。
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
編集:これを書いた後、TAoCP Vol 1、442-445ページのバディシステムベースの動的メモリ割り当てを読むと、曲線を(1 -e ^(-n / m))。Knuthは、「50パーセントルールの再検討」という概念についても少し背景を付けた論文を参照しています(pdfはこちらから入手できます)。
いずれかのフィルターがtrueを返す場合、アイテムはスケーラブルブルームフィルターにあります。したがって、以前のアイテムのメンバーシップクエリに影響を与えずにフィルターを追加できます。
最悪の場合の誤検知保証を確実に維持するために、幾何学的に減少する誤検知率の新しいフィルターが追加されます。たとえば、最初のフィルターには偽陽性率p
、2番目rp
、3番目r^2p
などがありますsum_{k>=0} r^k p = p/(1-r)
。その後、スケーラブルブルームフィルターに対する偽陽性の確率は、結合の境界によって制限されます。
スケーラブルブルームフィルターを読んでいて、構成ブルームフィルターがいっぱいになるたびに、より大きなサイズの新しいブルームフィルターが追加される方法を理解できませんでした。
最初に作成されたフィルターの設定ビットに寄与した要素は、存在を検索できません。おそらく私はこれを理解していないのでしょうか?
こんにちは、
基本的な考え方は、最初のレベルのフィルターのビットフィールドが飽和するまで最初のフィルターに追加することです。飽和しているということは、すべてのビットが使用されることを意味するわけではありませんが、フィルターに非常に多くのエントリが含まれているため、追加のエントリによって誤検出が多くなりすぎることを意味します。
飽和点から、新しいアイテムは飽和フィルターに追加されるのではなく、新しいより大きなサブフィルター(第2レベルのフィルター)に追加されます。
値を見つけるには、第1レベルのフィルターで検索し、そこで見つからない場合は、第2レベルのフィルターで検索します。これらのフィルターのいずれかでそれを見つけることができる場合、それは(たぶん)フィルターに「既知」です(ブルームフィルターの性質の結果として誤検知が発生する可能性があります)。いずれのフィルターにも値が見つからない場合、フィルターは値を表示しないことが保証されます。もちろん、これは再帰的なデータ構造として表現できます。
JavaでのスケーラブルなBloomフィルターの実装と、それがどのように機能するかについての説明を含む私のブログ投稿を読むことをお勧めします。