- 空間効率の良い[[確率的データ構造]]
- あるデータが集合に含まれているかの判定ができる。偽陽性(含まれていないのに含まれていると誤判定)がある。偽陰性(含まれているのに、含まれていないと誤判定)はない。
- 集合に要素を追加することはできるが、削除することはできない。
# アルゴリズム
- 長さ$m$、初期値0のビット配列$B$がある
- $k$個の異なるハッシュ関数がある(キーを$m$ビット配列のいずれかにマップする)
## 要素の追加
- 要素を$k$個のハッシュ関数に入力し、$k$個の配列インデックス$i_0, ..., i_{k-1}$を得る
- $\forall i \in \lbrace 0, ..., k-1 \rbrace: B[i_i] = 1$とする
## 要素のクエリ
- 要素を$k$個のハッシュ関数に入力し、$k$個の配列インデックス$i_0, ..., i_{k-1}$を得る
- $\forall i \in \lbrace 0, ..., k-1 \rbrace: B[i_i]$のうち、1つでも0があれば含まれていないことがわかる
- すべてが1であれば、含まれているとする(たまたま他の要素で1となってしまった偽陽性の可能性はある)
# 参考
- https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AB%E3%83%BC%E3%83%A0%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF