Home

Bloom filter

  • Given: Bloom filter (BF) のサイズ NNN\in\mathbb{N}
  • Given: KK 個のハッシュ関数 H={hk:Σ[1..N]}k=1,,KH=\{h_k:\Sigma^*\rightarrow[1..N]\}_{k=1,\cdots,K}

このとき、BF b=BF(N,H)b={\rm BF}(N, H) は、以下の 2 つの操作が定義された長さ NN のビットベクトル(初期値は 0)である。

  • add 操作: 任意の文字列 sΣs\in\Sigma^* を受け取り、bb{h(s)}hH\{h(s)\}_{h\in H} 番目のビットを 1 にする
  • find 操作: 任意の文字列 sΣs\in\Sigma^* を受け取り、bb{h(s)}hH\{h(s)\}_{h\in H} 番目のビットがすべて 1 なら真を、そうでなければ偽を返す

つまり、任意の文字列は HH によって、長さ NN のビットベクトル中の KK 個のビットフラグとして表現される。各文字列を表すフラグ列は重複が許されているので、find 操作は false positive を含む。一方で false negative rate は必ず 0 である。

BF の false positive rate cc については以下が成り立つ。

c=(1(11N)KM)Kc=\left(1-\left(1-\frac{1}{N}\right)^{KM}\right)^K

ここで、MM は追加したクエリの数である。したがって、

  • Given: 目標とする false positive rate c~\tilde{c}
  • Given: クエリ数の推定値 M~\tilde{M}

に対する BF のサイズ NN およびハッシュ関数の数 KK は以下に基づいて設定すればよい。

NKM~ln(1c~1K)N\sim\frac{-K\tilde{M}}{\ln(1-\tilde{c}^{\frac{1}{K}})}

BF は Approximate Member Query (AMQ) を実現する(確率的)データ構造の 1 つである。

発展

Counting Filter (CF)

BF bb をビットベクトルから正整数のベクトルに変更し(初期値はすべて 0)、

  • add 操作の「ビットを 1 にする」を「要素に 1 足す」に、
  • find 操作の「ビットがすべて 1 なら」を「要素がすべて>0>0なら」に、

それぞれ変更すると、

  • delete 操作: 任意の文字列 sΣs\in\Sigma^* を受け取り、bb{h(s)}hH\{h(s)\}_{h\in H} 番目の要素を 1 減らす

を定義することができる。bb のサイズは大きくなる。

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 のデータ構造