若是想判斷一個元素是否是在一個集合裏,通常想到的是將全部元素保存起來,而後經過比較肯定。鏈表、樹、散列表(又叫哈希表,Hash table)等等數據結構都是這種思路。可是隨着集合中元素的增長,咱們須要的存儲空間愈來愈大。同時檢索速度也愈來愈慢,上述三種結構的檢索時間複雜度分別爲O(n),O(\log n),O(n/k)。php
布隆過濾器的原理是,當一個元素被加入集合時,經過K個散列函數將這個元素映射成一個位數組中的K個點,把它們置爲1。檢索時,咱們只要看看這些點是否是都是1就(大約)知道集合中有沒有它了:若是這些點有任何一個0,則被檢元素必定不在;若是都是1,則被檢元素極可能在。這就是布隆過濾器的基本思想。數組
相比於其它的數據結構,布隆過濾器在空間和時間方面都有巨大的優點。布隆過濾器存儲空間和插入/查詢時間都是常數(O(k))。另外, 散列函數相互之間沒有關係,方便由硬件並行實現。布隆過濾器不須要存儲元素自己,在某些對保密要求很是嚴格的場合有優點。安全
布隆過濾器能夠表示全集,其它任何數據結構都不能;數據結構
k和m相同,使用同一組散列函數的兩個布隆過濾器的交併差運算可使用位操做進行。函數
可是布隆過濾器的缺點和優勢同樣明顯。誤算率是其中之一。隨着存入的元素數量增長,誤算率隨之增長。可是若是元素數量太少,則使用散列表足矣。google
另外,通常狀況下不能從布隆過濾器中刪除元素. 咱們很容易想到把位數組變成整數數組,每插入一個元素相應的計數器加1, 這樣刪除元素時將計數器減掉就能夠了。然而要保證安全地刪除元素並不是如此簡單。首先咱們必須保證刪除的元素的確在布隆過濾器裏面. 這一點單憑這個過濾器是沒法保證的。另外計數器迴繞也會形成問題。code
[https://code.google.com/p/php-bloom-filter/][1] [1]: https://code.google.com/p/php-bloom-filter/ "https://code.google.com/p/php-bloom-filter/"get