私はスケーラブルなブルームフィルターについて調べていましたが、構成要素のブルームフィルターがいっぱいになるたびに、より大きなサイズの新しいブルームフィルターが追加されていました。
最初に作成されたフィルターのセットビットに寄与した要素は、存在を調べることができません。多分私はこれの私の理解で間違っていますか?
基本的なブルームフィルターは理解しています。ただし、動的ブルームフィルターに頭を悩ますことはできません。
私がそれをどれだけ肉殺できるか見てみるためにこれを試してみましょう。 :-)
したがって、最初に、偽陽性の確率が最大になる有限要素数を許可する通常のブルームフィルターを作成できる必要があります。スケーラブルな実装を構築する前に、これらの機能を基本フィルターに追加する必要があります。
確率を制御および最適化する前に、指定されたブルームフィルターサイズの確率を把握します。
最初に、持っているハッシュ関数の数(ビットの総数/ハッシュ関数の数=スライス)でビットフィールドを分割し、各ハッシュ関数を表すビットの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でバディシステムベースの動的メモリ割り当てを読んでいるときに、「50%ルール」について言及しました。 1、pp 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番目のレベルのフィルター)に追加されます。
値を見つけるには、最初のレベルのフィルターで検索し、そこに見つからない場合は、2番目のレベルのフィルターで検索します。これらのフィルターのいずれかでそれを見つけることができる場合、それは(たぶん)フィルターに「既知」です(ブルームフィルターの性質の結果として誤検知が発生する可能性があります)。いずれかのフィルターで値を見つけることができない場合、フィルターはそれを見たことがないことが保証されます。もちろん、これは再帰的なデータ構造として表現できます。
JavaでのスケーラブルなBloomフィルターの実装と、それがどのように機能するかについての説明を含む 私のブログ投稿 を読みたいと思うかもしれません。