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。
爲了表示S={x1,x2,...,xn}這樣一個含有n個元素的集合,Bloom Filter使用k個相互獨立的哈希函數(Hash Function)將每個元素映射到{1,...,m}之間的範圍中。對於任意一個元素x,第i個哈希函數映射的位置爲hi(x)就會被置爲1(1=<i<=k)。在下圖中k=3(即使用3個哈希函數),且只有兩個哈希函數選中同一位置。
在判斷y是否屬於S集合時,我們對y使用k次哈希函數,如果所有的hi(y)的位置都是1(1=<i<=k),那麼我們認爲y就屬於集合S或者是一次誤判(false positive)。下圖中y1不屬於這個集合而y2屬於這個集合。
錯誤率估計
假定Bloom Filter有m位,裏面有n個元素,使用k個哈希函數。
因爲插入第一個元素時,每一個哈希函數將{1,...,m}範圍中的每一位被置爲1的概率爲1/m,那麼該位仍然爲0的概率爲(1-1/m),所以應用k個哈希函數後該位仍然爲0的概率爲:
在插入第二個元素時,某個特定的位置仍然爲0的概率爲:
在插入了n個元素後該位置仍然爲0的概率爲:
根據以上得出:一個特定的位置在插入了n個元素後,被設置爲1的概率則是:
在將n個元素插入Bloom Filter之後判斷某個新元素y是否在Bloom Filter中(確實在或者誤判)的概率時,需要hi(y)都爲1(1=<i<=k),所以y在Bloom Filter中的概率爲:
根據計算e常用的極限公式:
得出以下概率表達式:
根據以上概率表達式,假定一個元素使用16bit表示,k=8,那麼誤判率爲萬分之五,關於在不同m/n和k的情況下,布隆過濾器的誤識別率的參考數據大家可以查閱這個地址:
http://pages.cs.wisc.edu/~cao/papers/summary-cache/node8.html
最優的哈希函數個數
根據上面得出的誤判率公式很容易進行估計最優的哈希函數個數:
k=(m/n)*ln2