Bloom Filter是一種空間效率很高的機率型數據結構,由位數組和一組哈希函數組成。特色是高效地插入和查詢,能夠用來告訴你 「某樣東西必定不存在或者可能存在」。整體規則是:位數組中存放的是:集合中每一個元素的哈希轉二進制後對應的值,對於新加入的元素根據其哈希值去判斷是否已經存在於集合中。網頁爬蟲
Bloom Filter使用位數組來實現過濾,初始狀態下位數組每一位都爲0,以下圖所示:數組
假如此時有一個集合S = {x1, x2, … xn},Bloom Filter使用k個獨立的hash函數,分別將集合中的每個元素映射到{1,…,m}的範圍。對於任何一個元素,被映射到的數字做爲對應的位數組的索引,該位會被置爲1。好比元素x1被hash函數映射到數字8,那麼位數組的第8位就會被置爲1。下圖中集合S只有兩個元素x和y,分別被3個hash函數進行映射,映射到的位置分別爲(0,3,6)和(4,7,10),對應的位會被置爲1:緩存
如今假如要判斷另外一個元素是不是在此集合中,只須要被這3個hash函數進行映射,查看對應的位置是否有0存在,若是有的話,表示此元素確定不存在於這個集合,不然有可能存在。下圖所示就表示z確定不在集合{x,y}中:數據結構
對有可能存在的解釋函數
假設X進行三次hash後對應的bit位是(0,3,6),Y被三次hash後對應的bit位是(0,3,7),則Y在bit的0和3的值會覆蓋掉X的值,假設還有一個新元素Z的hash結果是(1,3,6),則意味着X的hash結果被所有覆蓋,也就是說即便沒有X,(0,3,6)位置的值也是1,因此只能是有可能存在。spa
因爲判斷某個元素在bloom filter是否存在時個機率問題,因此就不能隨便刪除一個元素了,如上若是咱們刪除了X元素的哈希結果,那麼Y元素和Z元素也會被誤判爲不存在集合中。.net
刪除元素問題能夠經過布隆過濾器的變體CBF(Counting bloomfilter)
解決。CBF將基本Bloom Filter每個Bit改成一個計數器,這樣就能夠實現刪除字符串的功能了。code
它將標準Bloom Filter位數組的每一位擴展爲一個小的計數器(Counter),在插入元素時給對應的k(k爲哈希函數個數)個Counter的值分別加1,刪除元素時給對應的k個Counter的值分別減1。Counting Bloom Filter經過多佔用幾倍的存儲空間的代價,給Bloom Filter增長了刪除操做。blog
其餘bloomfilter的升級版:索引
SBF(Spectral Bloom Filter)
:在判斷元素是否存在的基礎上還能夠查詢集合元素的出現頻率。
dlCBF(d-Left Counting Bloom Filter)
:利用 d-left hashing 的方法存儲 fingerprint,解決哈希表的負載平衡問題;
ACBF(Accurate Counting Bloom Filter)
:經過 offset indexing 的方式將 Counter 數組劃分紅多個層級
Runtime Filter
的過濾原理實現。http://blog.csdn.net/jiaomeng/article/details/1495500該文中從數學的角度闡述了布隆過濾器的原理,以及一系列的數學結論。
首先,與布隆過濾器準確率有關的參數有:
主要的數學結論有: