Bloom Filter 算法具體解釋

Bloom Filter 算法

Bloom filter是由Burton Bloom 在1970年提出的,其後在P2P上獲得了普遍的應用。Bloom filter 算法可用來查詢某一數據是否在某一數據集合中。其長處是查詢效率高、可節省空間。但其缺點是會存在必定的錯誤。所以Bloom filter 算法僅僅能應用於那些贊成有必定錯誤的場合。可以使用Bloom filter 算法的場合包含字典軟件、分佈式緩存、P2P網絡和資源路由等等。web

使用Bloom Filter咱們可以推斷一個元素是否在某一個集合中。假設這個集合是使用線性結構存儲的話。其查找的時間複雜度是O(n);使用像二叉樹或B-tree這種樹形結構存儲的話其查找的時間複雜度是O(logn)。而使用Bloom Filter在可以容忍必定錯誤率的狀況下,其時間複雜度是O(1)。所以,與傳統的權衡空間或時間的算法不一樣,Bloom Filter 極其巧妙。經過引入必定的錯誤率來換取時間和空間,在某些應用大大提升了性能。算法

Bloom Filter 算法應用

使用Bloom Filter算法查找某個元素是否屬於某個集合是常數時間,而且Bloom Filter使用的是位數組,大大下降了空間。數據庫

儘管有必定的錯誤率。但對於那些贊成有必定錯誤的場合則十分有效。數組

使用Bloom Filter還可以進行垃圾郵件過濾。因爲垃圾郵件的數量是很巨大的。假設將全部的垃圾郵件的地址都存到數據庫再進行垃圾郵件過濾,則其性能會很低下。緩存

此時假設經過垃圾郵件的地址建立Bloom Filter,並把Bloom Filter的位數組放到內存中,那麼在進行垃圾郵件過濾時就很高效了。markdown

在HTTP緩存server中。可以使用Bloom Filter來加快推斷Url是否在代理server的緩存中。網絡

在代理server中,首先用緩存頁面的Url經過哈希算法建立一個Bloom Filter的位數組。分佈式

假設有多個代理server。還可以將本身的位數組傳送給其餘代理server,以加快緩存查詢速度。當有HTTP請求來時。就先在代理server中查看是否有此Url的緩存,假設沒有,則查看是否在其餘代理server中。再沒有的話纔會去主server提取頁面。可以看出,使用Bloom Filter查詢某Url是否在緩存中很快,假設出現錯誤的狀況則最多到主server提取頁面。而且因爲Bloom Filter大大下降了空間的使用,使其在網絡上傳輸更加高速。函數

在web爬蟲中,也可以使用Bloom Filter。當web爬蟲處理了一個頁面時,首先會經過Bloom Filter推斷這個頁面是否已經處理過,假設沒處理過就對其進行處理並將其加到Bloom Filter中。在web爬蟲假設出現誤判,則最多對同一個Url多處理幾回,並不影響web爬蟲的性能。經過Bloom Filter反而大大提升了web爬蟲的性能。性能

總而言之。Bloom Filter近些年來獲得了普遍的應用,經過使用Bloom Filter可以加快對海量數據的查詢,提升應用的性能。

Bloom Filter算法思想

Bloom Filter算法就是對於有n個元素的集合S={x1, x2,……,xn},咱們用k個哈希函數(h1,h2,……,hn),分別將S中的每個元素映射到一個m位的位數組(bm-1bm-2……b1b0)中。該位數組在初始化時全部置爲0,每當用哈希函數映射到該位時則將該位置爲1。對於已經置爲1的位則不在反覆置1。

好比。將S={x1,x2,x3}這個集合用3個哈希函數映射到一個14位的位數組中,如圖所看到的:

建立Bloom Filter演示樣例

可以看出。假設要查找一個元素是否在這個集合中。則僅僅要將該元素進行k次哈希。假設其相應的位全部爲1的話則說明該元素在這個集合中。不然,僅僅要有當中一位爲0。則說明該元素不在這個集合中。

如圖所看到的,x2在集合中,而x4不在集合中。

查找Bloom Filter演示樣例

Bloom Filter會產生錯誤也就是因爲對某個元素進行k次哈希後相應的位全部爲1,所以錯誤地將這個元素斷定爲在這個集合中,但實際上這個元素並不在這個集合中。如圖所看到的。x5實際並不是這個集合的元素:

查找Bloom Filter出錯演示樣例

要將一個元素增長這個集合很easy,僅僅要將這個元素進行k次哈希後將相應的位置1便可了。

但假設要從這個集合中刪除一個元素,那麼使用上面的位數組就不行了。因爲假設僅僅是簡單地將k次哈希後相應的位置0,而其餘在這個集合中的元素也可能會映射到該位,這樣這個集合就出錯了。

所以,對於要進行刪除的狀況,則應該使用Bloom Filter的變體算法:計數Bloom Filter。


計數Bloom Filter位數組的每個元素並不是僅僅有1位。而多是2位或不少其餘位(視狀況而定)。如圖就是使用2位位數組的樣例:

建立計數Bloom Filter演示樣例

在這種狀況下,假設要刪除一個元素,則僅僅要將相應位的計數減1便可了。

刪除了x2以後如圖所看到的:

刪除一個計數Bloom Filter元素演示樣例

Bloom Filter算法分析

現在來分析一下標準的Bloom Filter的錯誤率。

剛開始時,m位的位數組初化爲0,進行一次哈希並設某一位爲1後位數組中某一位爲0的機率爲:(m-1)/m。而當對n個元素進行k次哈希後位數組中某一位爲0的機率爲:
p = ((m-1)/m)kn = (1 – 1/m)kn,

一個不在集合中的元素進行k次哈希後相應的位都爲1。所以,Bloom Filter的錯誤率爲:
f = (1 – (1 - 1/m)kn)k ,

因爲
公式

所以:
p = (1 – 1/m)kn = e-kn/m
即 k = -m·ln(p)/n,
f = (1 – e-kn/m)k
= exp(ln(1-e-kn/m)k)
= exp(kln(1-e-kn/m))
= exp(-m·ln(p)·ln(1-p)/n)

因爲exp(x)是一個遞增函數,爲了使錯誤率f最小。那麼-m·ln(p)·ln(1-p)/n就應該取最小值。

依據對稱性法則可以看出。當p = 1/2時-m·ln(p)·ln(1-p)/n取得最小值,即k = -m·ln(p)/n = m·ln2 / n。

因此當哈希函數的個數k = m·ln2 / n時,可以使得錯誤率最小。

又因爲p=1/2是對n個元素進行k次哈希後位數組中某一位爲0的機率,此時位數組中0和1各佔一半。即當讓位數組有一半是空的時,可以使錯誤率最低。

相關文章
相關標籤/搜索