【ぶるーむふぃるた】

ブルームフィルタ とは?

最終更新:
💡 「ない」はわかる。「あるかも」は再確認

要素をそのまま保存せず、ビット配列とハッシュ関数で集合への所属を調べるデータ構造。「含まれるかもしれない」と「含まれない」を判定し、不要な検索を減らす。存在するとの判定には偽陽性があり得る。

📌 このページのポイント
「あるかも」と「ない」を分けるAを追加 → 位置1と4を「1」に位置だけ記録。元の文字は保存しない0011020314050607I → 位置1と4両方1 → あるかもでもIは未登録!B → 位置2と70がある → ない検索を省ける「あるかも」は元のデータで確かめる
8ビット・2つのハッシュによる説明用の例。A=1、B=2、I=9として、位置はnを8で割った余りと、3n+1を8で割った余りです。
ひよこ ひよこ
普通の集合と、何が違うの?
ペンギン先生 ペンギン先生
普通の集合は要素そのものを保存して調べるけれど、ブルームフィルタは要素から計算したビットの位置だけを記録するよ。少ないメモリで事前チェックできる代わりに、「あるかも」の判定だけでは存在を確定できないんだ。
ひよこ ひよこ
ビットで、どうやって調べるの?
ペンギン先生 ペンギン先生
最初は全部0にした配列を用意する。追加するときは複数のハッシュ関数で位置を計算し、そのビットを1にするよ。調べるときも同じ位置を見る。1つでも0なら、その要素は追加されていない。全部1なら「追加されているかもしれない」だね。
ひよこ ひよこ
全部1なのに、入っていないことがあるの?
ペンギン先生 ペンギン先生
あるよ。別々の要素が、同じビットを1にすることがあるからね。入っていない要素を「あるかも」と判定するのが偽陽性。図ではAを追加した位置とIを調べる位置が重なる例にしたよ。元のデータを検索すれば、最終的に区別できるんだ。
ひよこ ひよこ
どこで役立つの?
ペンギン先生 ペンギン先生
たとえばデータベースを読む前に、キーが「ない」とわかれば不要な読み取りを省ける。CassandraはSSTableのパーティションキーにブルームフィルタを使うよ。必要なメモリは登録数と許容する偽陽性率で変わり、精度を高くすると多くのビットが必要になるんだ。
ひよこ ひよこ
要素を消すときは、ビットを0に戻せばいい?
ペンギン先生 ペンギン先生
通常のブルームフィルタでは、それはできないよ。同じビットを他の要素も使っているかもしれないからね。勝手に消すと、追加済みなのに「ない」と判定してしまう。「偽陰性がない」という性質は、追加した要素を正しく保持し、同じ方法で照会することが前提なんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ブルームフィルタ」って出てきたら「省メモリで『ない』を先に確かめるフィルタ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Bloom Filter」 = ブルームフィルタ
💬 要素そのものではなく、ハッシュ関数で選んだビットの位置を記録する仕組みだよ。

参考資料

← 用語集にもどる