布隆過濾器

Bloom Filter是一種空間利用率很高的隨機數據結構,它用位數組很簡潔地表示一個集合,並能判斷一個元素是否包含於該集合。Bloom Filter用一定的代價換取這種高效:在判斷一個元素是否包含於該集合時,有一定的機率(即誤判率 false positive rate)產生誤判(false positive)。因此,Bloom Filter不合適那些“零錯誤”的應用場合。

在能容忍低錯誤率的應用場合,Bloom Filter通過極少的錯誤換取了存儲空間的極大節省(只佔hash table的1/4甚至1/8)。


集合表示與元素查詢

下面我們看Bloom Filter是如何用位數組表示集合的。初始狀態:Bloom Filter是一個包含m位的位數組,每一位都置0。

154953219.jpg

爲了表示S={x1,x2,...,xn}這樣一個含有n個元素的集合,Bloom Filter使用k個相互獨立的哈希函數(Hash Function)將每個元素映射到{1,...,m}之間的範圍中。對於任意一個元素x,第i個哈希函數映射的位置爲hi(x)就會被置爲1(1=<i<=k)。在下圖中k=3(即使用3個哈希函數),且只有兩個哈希函數選中同一位置。

160032877.jpg

在判斷y是否屬於S集合時,我們對y使用k次哈希函數,如果所有的hi(y)的位置都是1(1=<i<=k),那麼我們認爲y就屬於集合S或者是一次誤判(false positive)。下圖中y1不屬於這個集合而y2屬於這個集合。


160456678.jpg

錯誤率估計

假定Bloom Filter有m位,裏面有n個元素,使用k個哈希函數。

因爲插入第一個元素時,每一個哈希函數將{1,...,m}範圍中的每一位被置爲1的概率爲1/m,那麼該位仍然爲0的概率爲(1-1/m),所以應用k個哈希函數後該位仍然爲0的概率爲:


163107495.png

在插入第二個元素時,某個特定的位置仍然爲0的概率爲:

163308609.png

在插入了n個元素後該位置仍然爲0的概率爲:

163530661.png

根據以上得出:一個特定的位置在插入了n個元素後,被設置爲1的概率則是:


163724432.png

在將n個元素插入Bloom Filter之後判斷某個新元素y是否在Bloom Filter中(確實在或者誤判)的概率時,需要hi(y)都爲1(1=<i<=k),所以y在Bloom Filter中的概率爲:

165850696.png

根據計算e常用的極限公式:

170056280.png

得出以下概率表達式:

170203682.png


根據以上概率表達式,假定一個元素使用16bit表示,k=8,那麼誤判率爲萬分之五,關於在不同m/n和k的情況下,布隆過濾器的誤識別率的參考數據大家可以查閱這個地址:

http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html

最優的哈希函數個數

根據上面得出的誤判率公式很容易進行估計最優的哈希函數個數:

k=(m/n)*ln2


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章