布隆過濾器之Counting Bloom Filter

Bloom Filter是一種空間效率很高的機率型數據結構,由位數組和一組哈希函數組成。特色是高效地插入和查詢,能夠用來告訴你 「某樣東西必定不存在或者可能存在」。整體規則是:位數組中存放的是:集合中每一個元素的哈希轉二進制後對應的值,對於新加入的元素根據其哈希值去判斷是否已經存在於集合中。網頁爬蟲

結構

Bloom Filter使用位數組來實現過濾,初始狀態下位數組每一位都爲0,以下圖所示:數組

img

假如此時有一個集合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:緩存

529239.png

如今假如要判斷另外一個元素是不是在此集合中,只須要被這3個hash函數進行映射,查看對應的位置是否有0存在,若是有的話,表示此元素確定不存在於這個集合,不然有可能存在。下圖所示就表示z確定不在集合{x,y}中:數據結構

img

對有可能存在的解釋函數

假設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

CBF

因爲判斷某個元素在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 數組劃分紅多個層級

應用場景

  1. 網頁爬蟲對URL的去重,避免爬取相同的URL地址;
  2. 反垃圾郵件,從數十億個垃圾郵件列表中判斷某郵箱是否垃圾郵箱(同理,垃圾短信);
  3. 緩存擊穿,將已存在的緩存放到布隆中,當黑客訪問不存在的緩存時迅速返回避免緩存及DB掛掉。
  4. spark的jion操做中Runtime Filter的過濾原理實現。

數學結論

http://blog.csdn.net/jiaomeng/article/details/1495500該文中從數學的角度闡述了布隆過濾器的原理,以及一系列的數學結論。

首先,與布隆過濾器準確率有關的參數有:

  • 哈希函數的個數k;
  • 布隆過濾器位數組的容量m;
  • 布隆過濾器插入的數據數量n;

主要的數學結論有:

  1. 爲了得到最優的準確率,當k = ln2 * (m/n)時,布隆過濾器得到最優的準確性;
  2. 在哈希函數的個數取到最優時,要讓錯誤率不超過є,m至少須要取到最小值的1.44倍;

參考

https://zhuanlan.zhihu.com/p/43263751

http://www.javashuo.com/article/p-cbngsayn-kv.html

相關文章
相關標籤/搜索