布隆過濾器

2022-05-17 01:44:13 字數 1993 閱讀 5213

布隆過濾器(bloomfilter)是一種緊湊型的、比較巧妙的概率型資料結構,特點是高效地插入和查詢,可以用來告訴你 某樣東西一定不存在或者可能存在,它是用多個雜湊函式,將乙個資料對映到位圖結構中。此種方式不僅可以提公升查詢效率,也可以節省大量的記憶體空間,但是布隆過濾器也存在一定的缺陷:資料只能插入不能刪除。

布隆過濾器的底層實現是點陣圖。

2.1 布隆過濾器的插入

布隆過濾器是由乙個很長的bit陣列和一系列雜湊函式組成的。結構如下:

陣列的每個元素都只佔1bit空間,並且每個元素只能為0或1。

布隆過濾器還擁有k個雜湊函式,當乙個元素加入布隆過濾器時,會使用k個雜湊函式對其進行k次計算,得到k個雜湊值,並且根據得到的雜湊值,在陣列中把對應下標的值置位1。

例:「baidu"這個值對應的三個不同的雜湊函式返回三個雜湊值分別為:1 、4 、7,則將其對應的下標置1,其結構就會變成下面這樣:

2.2 布隆過濾器的查詢

布隆過濾器的思想是將乙個元素用多個雜湊函式對映到乙個點陣圖中,因此被對映到的位置的位元位一定為1.

所以在查詢某個是否存在時,若該值利用三個不同的雜湊函式返回的雜湊值對應的下標至少有乙個為0,則說明該值一定不存在,若對應的值均為1,說明該值可能存在。

為什麼說是可能存在而不是一定存在呢?

因為可能會出現不同的值利用雜湊函式返回的雜湊值對應的下標相同,所以說只能得出可能存在的結果,即某些雜湊函式存在一定誤判。

2.3 布隆過濾器產生誤判的原因

當插入的元素越來越多時,當乙個不在布隆過濾器中的元素,經過同樣規則的雜湊計算之後,得到的值在陣列中查詢,有可能這些位置因為其他的元素先被置1了。

所以布隆過濾器存在誤判的情況,但是如果布隆過濾器判斷某個元素不在布隆過濾器中,那麼這個值就一定不在。

在介紹布隆過濾器的概念時提到布隆過濾器的缺點是不支援刪除,但是它不支援刪除的原因是什麼呢?

因為刪除乙個元素時可能會影響到其他元素。

舉個例子:「baidu"利用三個不同的雜湊函式返回的雜湊值為1,4,7,「tencent"利用三個不同的雜湊函式返回的雜湊值為3,4,8,假設刪除「baidu"這個元素,則1,4,7對應的下標置0,但是「tencent"這個元素與「baidu」對應的下標4重合,這樣就會將「tencent」這個元素也刪除,所以布隆過濾器不支援刪除。

一種支援刪除的方法:將布隆過濾器中的每個位元位擴充套件成乙個小的計數器,插入元素時給k個計數器(k個雜湊函式計算出的雜湊位址)加一,刪除元素時,給k個計數器減一,通過多占用幾倍儲存空間的代價來增加刪除操作。

但是這中刪除方法也存在一定缺陷:

無法確認元素是否真正在布隆過濾器中

存在計數迴繞

增加和查詢元素的時間複雜度為:o(k), (k為雜湊函式的個數,一般比較小),與資料量大小無關

雜湊函式相互之間沒有關係,方便硬體並行運算

布隆過濾器不需要儲存元素本身,在某些對保密要求比較嚴格的場合有很大優勢

在能夠承受一定的誤判時,布隆過濾器比其他資料結構有這很大的空間優勢

資料量很大時,布隆過濾器可以表示全集,其他資料結構不能

使用同一組雜湊函式的布隆過濾器可以進行交、並、差運算

有誤判率,即存在假陽性(false position),即不能準確判斷元素是否在集合中(補救方法:再建立乙個白名單,儲存可能會誤判的資料)

不能獲取元素本身

一般情況下不能從布隆過濾器中刪除元素

如果採用計數方式刪除,可能會存在計數迴繞問題

網頁爬蟲對url的去重,避免爬去相同的url位址。

垃圾郵件過濾,從數十億個垃圾郵件列表中判斷某郵箱是否是殺垃圾郵箱。

解決資料庫快取擊穿,黑客攻擊伺服器時,會構建大量不存在於快取中的key向伺服器發起請求,在資料量足夠大的時候,頻繁的資料庫查詢會導致掛機。

秒殺系統,檢視使用者是否重複購買。

布隆過濾器

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

布隆過濾器

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

布隆過濾器

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