文章目錄
http://bitworking.org/news/380/bloom-filter-resources
The Bloom filter, conceived by Burton H. Bloom in 1970, is a space-efficient probabilistic data structure that is used to test whether an element is a member of a set. False positives are possible, but false negatives are not. Elements can be added to the set, but not removed (though this can be addressed with a counting filter). The more elements that are added to the set, the larger the probability of false positives.
http://www.google.com.hk/ggblog/googlechinablog/2007/07/bloom-filter_7469.html
在日常生活中,包括在設計電腦軟體時,我們經常要判斷一個元素是否在一個集合中。比如在文書處理軟體中,需要檢查一個英語單詞是否拼字正確(也就是要判斷它是否在已知的字典中);在 FBI,一個嫌疑人的名字是否已經在嫌疑名單上;在網路爬蟲裡,一個網址是否被訪問過等等。
最直接的方法就是將集合中全部的元素存在電腦中,遇到一個新元素時,將它和集合中的元素直接比較即可。一般來講,電腦中的集合是用雜湊表(hash table)來儲存的。它的好處是快速準確,缺點是費儲存空間。布隆過濾器只需要雜湊表 1/8 到 1/4 的大小就能解決同樣的問題。
為什麼(原文沒說, 我的理解), 因為hash如果要work就要避免衝突, 要避免衝突就需要很大的bucket空間(bit). 而Bloom的優點時允許衝突, 但他通過增加hash函數的數量, 來減小同時衝突的機率, 所以可以用更小的空間.
而且hash table的實現往往用的是指標array, 用於指向集合元素, 而bloom的實現用的是bitarray, 因為你不需要得到這個集合元素, 只是知道他有沒有.
pybloom 1.0.2
http://pypi.python.org/pypi/pybloom/1.0.2
>>> b = BloomFilter(capacity=100000, error_rate=0.001)
>>> b.add("test")
False
>>> "test" in b
True