検索に移動この項目では、確率的データ構造について説明しています。画像にぼかし効果を付加する画像フィルタについては「川瀬のブルームフィルター」をご覧ください。考案した空間効率の良い確率的データ構造であり、要素が集合のメンバーであるかどうかのテストに使われる。negative)はない。集合に要素が追加されればされるほど、偽陽性の可能性が高くなる。外部リンク使用例[編集]例えば、ブルームフィルタを使って空間効率の良いスペルチェックを行うことができる。正しい単語を集めた辞書のブルームフィルタは、辞書に登録されている全単語を受容し、登録されていない単語はほとんど受容しない。若干不正確ではあるが、それで十分な場合もある。1バイト程度でデータ構造が構築できる。このスペルチェッカーの面白い特性として、そのデータ構造から正しい単語のリストを取り出すことができないのである。頑張っても、正しい単語のリストとさらにおびただしい偽陽性の単語のリストが得られてしまう(混じっていて、どれが正しいかわからない)。これを機能と捉えれば、例えばディスク内に残っている重要な番号(クレジットカード番号など)を探し出すとか、大量の電子メールから特定の(他人に知られたくない)アドレスを含むものを探し出すといった用途が考えられる。これは完全に安全な方法ではないが、偽陽性は別の手段で取り除くことができるだろう。表現したブルームフィルタ(m=18、k=3)の例。色つきの矢印は各元に対応しているビット配列上の位置を示している。含まれないので、対応するビット位置の一部がゼロになっている。ビットのビット配列である。個の配列位置のいずれかにマッピングする。幅広い出力をする良いハッシュ関数では、その生成するハッシュ値の各ビットの値は相互の関連がほとんどないはずなので、ハッシュ値を適当なビット位置で分割して複数の異なるハッシュ関数として使うことができる。種類のハッシュ関数としたりできる。個の配列インデックスを得る。個の配列インデックスを得る。場合、その要素はその集合には含まれていない。なった(偽陽性)と考えられる。この単純なブルームフィルタから要素を削除することはできない。すると他の要素まで同時に削除することになる。データ構造そのものからはそのような衝突が発生しているかどうかは判定できない。従って無理やり削除すると、本来発生しないはずの偽陰性が発生してしまう。キー値すべてを列挙するようなデータ構造では巨大すぎる場合にはブルームフィルタが役立つ。偽陽性発生率が高くなりすぎた場合、ブルームフィルタを再生成する必要が生じるが、これは比較的まれな事象である。空間的/時間的な優位性[編集]偽陽性の危険はあるが、ブルームフィルタは同様の集合的データ構造(平衡2分探索木、trie、ハッシュテーブル、単純な配列、線形リスト)に比べて遥かに空間効率が良い。文字列の同じ位置が同じ文字であればそれを共有することができる)。リンクを持つデータ構造はポインタを格納するための追加のメモリ領域を必要とする。ビットの格納領域があればよい。これは要素そのもののサイズとは無関係な値である。この利点は配列を利用している点と確率的特徴から生じている。取りうる要素の種類が少なく、その多くが集合に含まれている場合は、ブルームフィルタより確定的なビット配列の方が効率が良い。確定的なビット配列では、取りうる要素あたり1ビットで表すことができるのだから。ブルームフィルタと同じものとなる。O(k)の固定時間しかかからず、格納されている要素数には全く影響されないのである。固定サイズのデータ構造でこのような特徴を持つデータ構造はないが、コリジョンのない疎なハッシュテーブルはブルームフィルタよりも高速な場合がある。個のハッシュ関数を論理回路化して並行動作できるため、高速化が容易である。ブルームフィルタの場合を考えて見よう。なる部分が十分少なくなければならない。このときの配列の情報量もサイズに比較して低くなる。なるビット数が増えても同程度の偽陽性発生率を維持できる。なる程度にでき、ちょうど情報量を最大にして冗長性を最小にできる。