布隆過濾器(Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進位向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。Bloom filter的原理可以參考:維基百科【1】、論文【2】、網路文章【3】,還有文章【4】中有簡單的程式實現。
我的總結:
1、Bloom Filter的原理非常簡單,可以說是對Bit-map的擴充,Bit-map是用一個hash函數將資料對應到位元組的某一位,而Bloom Filter是用k個hash函數將資料對應到位元組的k位,檢測時只有當k位都置為1才認為該資料存在;
2、Bloom Filter相對於Bit-map的優勢。Bit-map實際上就是一個hash表,hash表的最常見的問題是地址衝突,文章【4】中提到“若要降低衝突發生的機率到1%,就要將BitSet的長度設定為URL個數的100倍。”,而Bloom Filter因為使用了多個hash函數,所以衝突的機率是非常低的,論文【2】中對Bloom Filter的錯誤機率進行了分析。總的來說,Bloom Filter出錯機率要低,而且空間效率要高;
3、若位元組大小為m、加入的資料為n、雜湊函數個數為k,文獻【2】中證明了對於給定的m、n,當 k = ln(2)* m/n 時出錯的機率是最小的;
4、Bloom Filter的特點:①不儲存未經處理資料;②不能對插入的資料進行計數;③插入的資料是不能刪除的,因為刪除(即清除對應的k個bit位)會影響別的資料對應的bit位。相比之下,Bit-map是可以刪除資料的(因為資料到bit位是一一對應的);
5、應用場合,由Bloom Filter的特點(不儲存未經處理資料、無法計數、無法刪除等)可知,非常適合於記錄和查詢某些資料是否“出現”過,例如網路爬蟲為了避免重複爬取網頁需要記錄訪問過的URL(文獻【4】中列出並比較了該應用例子的不同方法),就可以將URL映射到Bloom Filter的位元組中。當然,適用Bloom Filter有一個前提——允許有一定的錯誤率!
參考文獻:
【1】http://en.wikipedia.org/wiki/Bloom_filter
【2】http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html
【3】http://blog.csdn.net/jiaomeng/article/details/1495500
【4】http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.html