誤検知のない確率的セット?


35

したがって、ブルームフィルターは非常にクールです。これらは、偽陰性のないメンバーシップチェックをサポートするセットですが、偽陽性の可能性はわずかです。しかし最近、私は反対を保証する「ブルームフィルター」を望んでいます:偽陽性はなく、潜在的に偽陰性。

私の動機は単純です:処理するアイテムの(大量の)ストリームが大量にある場合、前に見たアイテムの処理を避けたいと思います。複製を処理するのに害はなく、時間の無駄です。しかし、要素の処理を怠ると、壊滅的なものになります。「逆ブルームフィルター」を使用すると、スペースのオーバーヘッドがほとんどないアイテムを保存し、セット内のメンバーシップをテストすることで、重複の処理を高い確率で回避できます。

しかし、私はそのようなものを見つけることができないようです。私が見つけた最も近いものは「レタッチされたブルームフィルター」です。これにより、選択された誤検知をより高い誤検知率と交換することができます。ただし、すべての誤検知を削除たい場合、それらのデータ構造がどれだけうまく機能するかはわかりません。

誰でもこのようなものを見ましたか?:)


3
私が興味を持っているセットの補完は無限です。どのように保存しますか?
クリストファーモンサント

11
問題が表示されます(最新のディスクはまだ十分に大きくありません)。
デイブクラーク

8
このようなデータ構造があれば、それを通常のブルームフィルターと組み合わせて使用​​して「チート」し、正確なセットメンバーシップを格納できます。
マークライトブラット

1
@MarkReitblattブルームフィルターとキャッシュの両方は確率的であり、それらの組み合わせは確率的です。つまり、正確なセットメンバーシップテストを達成できません。:)
awdz9nld

回答:


25

1つの答えは、大きなハッシュテーブルを使用し、それがいっぱいになったら、他の場所に(存在しない)空のスロットを見つけるのではなく、その中の要素を置き換え始めることです。ブルームフィルターで行うような固定された誤答率は得られませんが、何もしないよりはましです。これは、すでに検索された位置を追跡するためのチェスソフトウェアなどの標準的なものだと思います。


答えてくれてありがとう。ええ、それは明らかな解決策です-それが標準的な解決策でもある場合、私は運が悪いように聞こえます。しかたがない。
クリストファーモンサント

2
これは、ダイレクトマップキャッシュと呼ばれ、一般的にCPUで使用されます。(キャッシュまたは非可逆ハッシュセットは、さまざまな程度で要件に適合します)。エラー率は、ハッシュ関数の分布(雪崩)とキャッシュ/セットで利用可能なスロットの数の関数です。それに応じて調整してください。:)
awdz9nld

また、誤
検知を発生

20

この質問に対する答えは「いいえ」です。理由を確認するために、非常に極端な場合と、通常のブルームフィルターが「グロザーフィルター」と呼ばれる理論的な「Bizzaro World」ブルームフィルターとどのように機能するかを考えることができます。

ブルームフィルターの優れている点は、エラーの確率と保存されているアイテムのに関して固定サイズのデータ​​構造を使用して、アイテムのメンバーシップ(誤検知)の片側テストを実行できることです。アイテム自体のサイズはまったく関係ありません。たとえば、最大1,000個のアイテムを3%未満のエラーで格納するようにブルームフィルターを設定した場合、Wikipediaのコーパス全体の1,000種類のわずかに異なるバージョンを格納し、それぞれに1文字ずつ変更して、必要なメトリックを取得すると、データ構造は非常に小さくなります(1キロバイト未満)。もちろん、これらのハッシュを計算することは困難ですが、その原則は依然として有効です。

次に、これらの同じ大きな文字列を暗闇のフィルターに保存することを検討してください!今は偽陰性しか持てません。したがって、「はい、ウィキペディアのコーパス全体のこのバージョンがこのセットに含まれています」と言う場合、それについて絶対に正しい必要があります。同じ値にハッシュする他の文字列が常に存在するため、ハッシュは役に立たないことを意味します。「はい」と言って確認する唯一の方法は、文字列全体、または同じ長さの同等のデータを保存することです。常に保存して「いいえ」と言うことはできませんでしたが、最終的にはエラー率が追いつきます。できることは圧縮であり、構造のサイズを、格納されているデータのエントロピーと必要な精度の積にまで下げます。

そのため、残念なことに、暗闇フィルターは存在しません。キャッシングが唯一の解決策ですが、保存される情報の量とフィルターの望ましい精度の積に比例するため、実際にはブルームフィルターの反対ではありません。もちろん、多くの実際のシナリオでは、大きなデータをIDで表すことができるため、キャッシングは依然として受け入れられます。ただし、強力なブルームフィルターとは根本的に異なります。


checkout somethingsimilar.com/2012/05/21/the-opposite-of-a-bloom-filter-この実装の何が問題なの
Yehosef

@Yehosefそれは問題なく、あなたのニーズに合うかもしれませんが、著者は「イベントを完全に識別するいくつかのID」があることについて話していることに気付くでしょう。したがって、実装されるのは、オブジェクト全体を効果的に保存することです。したがって、これはキャッシュの変形です。実際の「ブルームフィルターの反対側」が存在する場合、オブジェクト全体を保存する必要はありません。
pents90

彼は、オブジェクト全体ではなく、イベントを識別するいくつかのIDに言及しました。インタラクションレコード全体ではなく、session_idに「キャッシュ」を保持するだけです。しかし、ブルームやハイパーログと同じタイプのアプローチではないと聞いています。
エホセフ

「証明」では、可能なエントリの数に制限がないと想定しています。ただし、可能なエントリのセットが事前にわかっている場合があります。たとえば、メモリページのガベージコレクションの場合、どのエントリが含まれているかがわかります。次に、可能性のある各エントリをインデックス0..nにマップする「グルームフィルター」を作成します。エントリが削除されたら、そのインデックスにビットを設定します。すべてのビットが設定されると、ページをガベージコレクションできます。「グルームフィルター」はMPHFです。偽陰性を許可するには、一部のエントリがn + 1にマッピングされるようにMPHFを変更します。
トーマスミューラー

@ThomasMueller正解、最悪のケース/敵対的なケースを想定しています。これは標準的なCS理論の観点です。N個の可能なエントリの固定セットしかない場合、各アイテムに必要なのはlog Nのスペースだけで、多くの簡単な解決策があることは事実です。ただし、ブルームフィルターにはこのような制限はありません。
-pents90

13

キャッシュが欲しいだけなのに、奇妙な方法で考えています。


1
...手入れを気にしますか?もちろん、キャッシュは機能しますが、それは理想的ではないため、確率的データ構造の最新技術に関する質問です。より具体的に言うと、私が知っているキャッシング技術は多くのストレージを必要とします。キャッシュレベルが多いほど、使用されるストレージが多くなります。キャッシュに保存されている要素に境界を設定したり、使用パターンでトリックを行ったりすることもできますが、それでも、ブルームフィルターが提供する空間効率と誤答の比率に近づきません。
クリストファーモンサント

1
(続き)そうは言っても、すべての問題を解決する明白なキャッシング技術を忘れているかもしれません。その場合、ウィキペディアの一般的なカテゴリへのリンクを提供する代わりに、その手法を明示的にすることができますか?
クリストファーモンサント

2

免責事項:私はキャッシュの専門家ではないので、これはナイーブなアイデアかもしれませんし、これまで聞いたことのない既知のアイデアかもしれません。その参照を引用できない場合は、すみません(存在する場合)。投稿を編集して追加するための参照がある場合はお知らせください。(私はそれが非常に直感的であるため、参照があるかもしれないと疑っています)。

Strilancに触発された後の簡単な解決策は、最大エントリ(は一定の定数)の関連付けマップを保持して、アイテムを表示回数と関連付けることです。関連付けマップがいっぱいで、マップにない新しいアイテムに出会った場合、コインを裏返して追加するかどうかを決めます。追加する場合は、それまでに表示された回数に反比例する確率でアイテムを削除します。ccc


0

私は、部分陰性のAVL(および場合によっては赤黒)ツリーを使用して、偽陰性のないフィルターとして機能しました。ツリーを挿入または照会するときは、アイテムの最初のXバイトのみを使用します。データ構造の形式は確率的ではないため、ビット衝突による誤検知のリスクはありません。また、アイテム全体をキャッシュするのとは異なり、このアプローチは計算可能な最大スペースを提供します。誤検出とスペースのコストと比較して、異なるプレフィックス長/ツリー深度を考慮することにより、誤検出の割合を調整できます。


また、文字列データでの試行を試みましたが、私のデータはパックされたバイナリ構造である傾向があります。
-JRideout

0

上記のデータ構造が存在できないことを示す下限を証明できると思います。基本的に、データ構造がmビットを使用する場合、固定ビットベクトル(入力の表現)は、カウント引数によって最大(((un)+ n eps)\ choose(un))セットに対応できます。この数が少なくとも2 ^ m倍(u \ choose n)でなければならない(すべてのセットを表現する必要がある)ため、基本的にセットSを正確に格納することに非常に近い下限が得られます。

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