布隆過濾器基礎原理

布隆過濾器(Bloom Filter)算法

是1970年由布隆提出的。它其實是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器能夠用於檢索一個元素是否在一個集合中。數據庫

它的優勢是空間效率和查詢時間都比通常的算法要好的多,缺點是有必定的誤識別率和刪除困難。數組

本質上布隆過濾器是一種數據結構,比較巧妙的機率型數據結構(probabilistic data structure),特色是高效地插入和查詢,能夠用來告訴你服務器

「某樣東西必定不存在或者可能存在」,可能存在的前提下再去數據庫進行準確查找,或者查找白名單。數據結構

 

實現原理

HashMap 的問題

講述布隆過濾器的原理以前,咱們先思考一下,一般你判斷某個元素是否存在用的是什麼?應該蠻多人回答 HashMap 吧,確實能夠將值映射到 HashMap 的 Key,而後能夠在 O(1) 的時間複雜度內返回結果,效率奇高。函數

可是 HashMap 的實現也有缺點,例如存儲容量佔比高,考慮到負載因子的存在,一般空間是不能被用滿的,而一旦你的值不少例如上億的時候,那 HashMap 佔據的內存大小就變得很可觀了。spa

還好比說你的數據集存儲在遠程服務器上,本地服務接受輸入,而數據集很是大不可能一次性讀進內存構建 HashMap 的時候,也會存在問題。orm

布隆過濾器數據結構

布隆過濾器是一個 bit 向量或者說 bit 數組,長這樣:內存

 

 
image

若是咱們要映射一個值到布隆過濾器中,咱們須要使用多個不一樣的哈希函數生成多個哈希值,並對每一個生成的哈希值指向的 bit 位置 1,例如針對值 「baidu」 和三個不一樣的哈希函數分別生成了哈希值 一、四、7,則上圖轉變爲:get

 

 
image

Ok,咱們如今再存一個值 「tencent」,若是哈希函數返回 三、四、8 的話,圖繼續變爲:

 

 
image

值得注意的是,4 這個 bit 位因爲兩個值的哈希函數都返回了這個 bit 位,所以它被覆蓋了。如今咱們若是想查詢 「dianping」 這個值是否存在,哈希函數返回了 一、五、8三個值,

結果咱們發現 5 這個 bit 位上的值爲 0,說明沒有任何一個值映射到這個 bit 位上,所以咱們能夠很肯定地說 「dianping」 這個值不存在。而當咱們須要查詢 「baidu」 這個值是否存在的話,

那麼哈希函數必然會返回 一、四、7,而後咱們檢查發現這三個 bit 位上的值均爲 1,那麼咱們能夠說 「baidu」 存在了麼?答案是不能夠,只能是 「baidu」 這個值可能存在。

這是爲何呢?答案跟簡單,由於隨着增長的值愈來愈多,被置爲 1 的 bit 位也會愈來愈多,這樣某個值 「taobao」 即便沒有被存儲過,可是萬一哈希函數返回的三個 bit 位都被其餘值置位了 1 ,那麼程序仍是會判斷 「taobao」 這個值存在。

 

應用:

1.網頁URL的去重

2.垃圾郵件的判別

3.集合重複元素的判別

4.查詢加速(好比基於key-value的存儲系統)

相關文章
相關標籤/搜索