布隆過濾器

2021-09-25 11:14:00 字數 1581 閱讀 6921

本質上布隆過濾器是一種資料結構,比較巧妙的概率型資料結構(probabilistic data structure),特點是高效地插入和查詢,可以用來告訴你 「某樣東西一定不存在或者可能存在」。

相比於傳統的 list、set、map 等資料結構,它更高效、占用空間更少,但是缺點是其返回的結果是概率性的,而不是確切的。

布隆過濾器資料結構

布隆過濾器是乙個 bit 向量或者說 bit 陣列,長這樣:

如果我們要對映乙個值到布隆過濾器中,我們需要使用多個不同的雜湊函式生成多個雜湊值,並對每個生成的雜湊值指向的 bit 位置 1,例如針對值 「baidu」 和三個不同的雜湊函式分別生成了雜湊值 1、4、7,則上圖轉變為:

ok,我們現在再存乙個值 「tencent」,如果雜湊函式返回 3、4、8 的話,圖繼續變為:

值得注意的是,4 這個 bit 位由於兩個值的雜湊函式都返回了這個 bit 位,因此它被覆蓋了。現在我們如果想查詢 「dianping」 這個值是否存在,雜湊函式返回了 1、5、8三個值,結果我們發現 5 這個 bit 位上的值為 0,說明沒有任何乙個值對映到這個 bit 位上,因此我們可以很確定地說 「dianping」 這個值不存在。而當我們需要查詢 「baidu」 這個值是否存在的話,那麼雜湊函式必然會返回 1、4、7,然後我們檢查發現這三個 bit 位上的值均為 1,那麼我們可以說 「baidu」 存在了麼?答案是不可以,只能是 「baidu」 這個值可能存在。

這是為什麼呢?答案跟簡單,因為隨著增加的值越來越多,被置為 1 的 bit 位也會越來越多,這樣某個值 「taobao」 即使沒有被儲存過,但是萬一雜湊函式返回的三個 bit 位都被其他值置位了 1 ,那麼程式還是會判斷 「taobao」 這個值存在。

支援刪除麼

目前我們知道布隆過濾器可以支援 add 和 i***ist 操作,那麼 delete 操作可以麼,答案是不可以,例如上圖中的 bit 位 4 被兩個值共同覆蓋的話,一旦你刪除其中乙個值例如 「tencent」 而將其置位 0,那麼下次判斷另乙個值例如 「baidu」 是否存在的話,會直接返回 false,而實際上你並沒有刪除它。

如何解決這個問題,答案是計數刪除。但是計數刪除需要儲存乙個數值,而不是原先的 bit 位,會增大占用的記憶體大小。這樣的話,增加乙個值就是將對應索引槽上儲存的值加一,刪除則是減一,判斷是否存在則是看值是否大於0。

黑名單

比如郵件黑名單過濾器,判斷郵件位址是否在黑名單中

網路爬蟲

判斷某個url是否已經被爬取過

k-v系統快速判斷某個key是否存在

參考:

布隆過濾器

布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...

布隆過濾器

布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...

布隆過濾器

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...