【轉自http://blog.csdn.net/jiaomeng/】焦萌 2007年1月27日數據庫
Bloom Filter是一種空間效率很高的隨機數據結構,它利用位數組很簡潔地表示一個集合,並能判斷一個元素是否屬於這個集合。Bloom Filter的這種高效是有必定代價的:在判斷一個元素是否屬於某個集合時,有可能會把不屬於這個集合的元素誤認爲屬於這個集合(false positive)。所以,Bloom Filter不適合那些「零錯誤」的應用場合。而在能容忍低錯誤率的應用場合下,Bloom Filter經過極少的錯誤換取了存儲空間的極大節省。數組
下面咱們具體來看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)。注意,若是一個位置屢次被置爲1,那麼只有第一次會起做用,後面幾回將沒有任何效果。在下圖中,k=3,且有兩個哈希函數選中同一個位置(從左邊數第五位)。 數據結構
在判斷y是否屬於這個集合時,咱們對y應用k次哈希函數,若是全部hi(y)的位置都是1(1≤i≤k),那麼咱們就認爲y是集合中的元素,不然就認爲y不是集合中的元素。下圖中y1就不是集合中的元素。y2或者屬於這個集合,或者恰好是一個false positive。app
前面咱們已經提到了,Bloom Filter在判斷一個元素是否屬於它表示的集合時會有必定的錯誤率(false positive rate),下面咱們就來估計錯誤率的大小。在估計以前爲了簡化模型,咱們假設kn<m且各個哈希函數是徹底隨機的。當集合S={x1, x2,…,xn}的全部元素都被k個哈希函數映射到m位的位數組中時,這個位數組中某一位仍是0的機率是:ide
其中1/m表示任意一個哈希函數選中這一位的機率(前提是哈希函數是徹底隨機的),(1-1/m)表示哈希一次沒有選中這一位的機率。要把S徹底映射到位數組中,須要作kn次哈希。某一位仍是0意味着kn次哈希都沒有選中它,所以這個機率就是(1-1/m)的kn次方。令p = e-kn/m是爲了簡化運算,這裏用到了計算e時經常使用的近似:函數
令ρ爲位數組中0的比例,則ρ的數學指望E(ρ)= p’。在ρ已知的狀況下,要求的錯誤率(false positive rate)爲:post
(1-ρ)爲位數組中1的比例,(1-ρ)k就表示k次哈希都恰好選中1的區域,即false positive rate。上式中第二步近似在前面已經提到了,如今來看第一步近似。p’只是ρ的數學指望,在實際中ρ的值有可能偏離它的數學指望值。M. Mitzenmacher已經證實[2] ,位數組中0的比例很是集中地分佈在它的數學指望值的附近。所以,第一步的近似得以成立。分別將p和p’代入上式中,得:spa
相比p’和f’,使用p和f一般在分析中更爲方便。.net
既然Bloom Filter要靠多個哈希函數將集合映射到位數組中,那麼應該選擇幾個哈希函數才能使元素查詢時的錯誤率降到最低呢?這裏有兩個互斥的理由:若是哈希函數的個數多,那麼在對一個不屬於集合的元素進行查詢時獲得0的機率就大;但另外一方面,若是哈希函數的個數少,那麼位數組中的0就多。爲了獲得最優的哈希函數個數,咱們須要根據上一小節中的錯誤率公式進行計算。
先用p和f進行計算。注意到f = exp(k ln(1 − e−kn/m)),咱們令g = k ln(1 − e−kn/m),只要讓g取到最小,f天然也取到最小。因爲p = e-kn/m,咱們能夠將g寫成
根據對稱性法則能夠很容易看出當p = 1/2,也就是k = ln2· (m/n)時,g取得最小值。在這種狀況下,最小錯誤率f等於(1/2)k ≈ (0.6185)m/n。另外,注意到p是位數組中某一位還是0的機率,因此p = 1/2對應着位數組中0和1各一半。換句話說,要想保持錯誤率低,最好讓位數組有一半還空着。
須要強調的一點是,p = 1/2時錯誤率最小這個結果並不依賴於近似值p和f。一樣對於f’ = exp(k ln(1 − (1 − 1/m)kn)),g’ = k ln(1 − (1 − 1/m)kn),p’ = (1 − 1/m)kn,咱們能夠將g’寫成
一樣根據對稱性法則能夠獲得當p’ = 1/2時,g’取得最小值。
下面咱們來看看,在不超過必定錯誤率的狀況下,Bloom Filter至少須要多少位才能表示全集中任意n個元素的集合。假設全集中共有u個元素,容許的最大錯誤率爲є,下面咱們來求位數組的位數m。
假設X爲全集中任取n個元素的集合,F(X)是表示X的位數組。那麼對於集合X中任意一個元素x,在s = F(X)中查詢x都能獲得確定的結果,即s可以接受x。顯然,因爲Bloom Filter引入了錯誤,s可以接受的不只僅是X中的元素,它還可以є (u - n)個false positive。所以,對於一個肯定的位數組來講,它可以接受總共n + є (u - n)個元素。在n + є (u - n)個元素中,s真正表示的只有其中n個,因此一個肯定的位數組能夠表示
個集合。m位的位數組共有2m個不一樣的組合,進而能夠推出,m位的位數組能夠表示
個集合。全集中n個元素的集合總共有
個,所以要讓m位的位數組可以表示全部n個元素的集合,必須有
即:
上式中的近似前提是n和єu相比很小,這也是實際狀況中經常發生的。根據上式,咱們得出結論:在錯誤率不大於є的狀況下,m至少要等於n log2(1/є)才能表示任意n個元素的集合。
上一小節中咱們曾算出當k = ln2· (m/n)時錯誤率f最小,這時f = (1/2)k = (1/2)mln2 / n。如今令f≤є,能夠推出
這個結果比前面咱們算得的下界n log2(1/є)大了log2 e ≈ 1.44倍。這說明在哈希函數的個數取到最優時,要讓錯誤率不超過є,m至少須要取到最小值的1.44倍。
在計算機科學中,咱們經常會碰到時間換空間或者空間換時間的狀況,即爲了達到某一個方面的最優而犧牲另外一個方面。Bloom Filter在時間空間這兩個因素以外又引入了另外一個因素:錯誤率。在使用Bloom Filter判斷一個元素是否屬於某個集合時,會有必定的錯誤率。也就是說,有可能把不屬於這個集合的元素誤認爲屬於這個集合(False Positive),但不會把屬於這個集合的元素誤認爲不屬於這個集合(False Negative)。在增長了錯誤率這個因素以後,Bloom Filter經過容許少許的錯誤來節省大量的存儲空間。
自從Burton Bloom在70年代提出Bloom Filter以後,Bloom Filter就被普遍用於拼寫檢查和數據庫系統中。近一二十年,伴隨着網絡的普及和發展,Bloom Filter在網絡領域得到了新生,各類Bloom Filter變種和新的應用不斷出現。能夠預見,隨着網絡應用的不斷深刻,新的變種和應用將會繼續出現,Bloom Filter必將得到更大的發展。
[1] A. Broder and M. Mitzenmacher. Network applications of bloom filters: A survey. Internet Mathematics, 1(4):485–509, 2005.
[2] M. Mitzenmacher. Compressed Bloom Filters. IEEE/ACM Transactions on Networking 10:5 (2002), 604—612.
[3] www.cs.jhu.edu/~fabian/courses/CS600.624/slides/bloomslides.pdf
[4] http://166.111.248.20/seminar/2006_11_23/hash_2_yaxuan.ppt