- Given: Bloom filter (BF) のサイズ
- Given: 個のハッシュ関数
このとき、BF は、以下の 2 つの操作が定義された長さ のビットベクトル(初期値は 0)である。
- add 操作: 任意の文字列 を受け取り、 の 番目のビットを 1 にする
- find 操作: 任意の文字列 を受け取り、 の 番目のビットがすべて 1 なら真を、そうでなければ偽を返す
つまり、任意の文字列は によって、長さ のビットベクトル中の 個のビットフラグとして表現される。各文字列を表すフラグ列は重複が許されているので、find 操作は false positive を含む。一方で false negative rate は必ず 0 である。
BF の false positive rate については以下が成り立つ。
ここで、 は追加したクエリの数である。したがって、
- Given: 目標とする false positive rate
- Given: クエリ数の推定値
に対する BF のサイズ およびハッシュ関数の数 は以下に基づいて設定すればよい。
BF は Approximate Member Query (AMQ) を実現する(確率的)データ構造の 1 つである。
発展
Counting Filter (CF)
BF をビットベクトルから正整数のベクトルに変更し(初期値はすべて 0)、
- add 操作の「ビットを 1 にする」を「要素に 1 足す」に、
- find 操作の「ビットがすべて 1 なら」を「要素がすべてなら」に、
それぞれ変更すると、
- delete 操作: 任意の文字列 を受け取り、 の 番目の要素を 1 減らす
を定義することができる。 のサイズは大きくなる。
Quotient Filter (QF)
https://arxiv.org/abs/1208.0290
CQ よりも高空間効率
Rank-and-Select-based Quotient Filter (RSQF)
https://dl.acm.org/citation.cfm?id=3035963
下の CQF のための準備的定義
Counting Quotient Filter (CQF)
https://dl.acm.org/citation.cfm?id=3035963
おそらく現状最も時間・空間効率の良い AMQ のデータ構造