布隆過濾器

轉自:談談布隆過濾器,保存在此以學習。

之前就閱讀過數學之美,知道有這麼個基礎的算法,可是因爲不常用到也就沒當回事,最近重新看到它覺得很高大上,就想來mark下

設計初衷: 
(Bloom Filter)是由布隆(Burton Howard Bloom)在1970年提出的,不知道當時布隆爲啥想到設計時究竟是碰到了啥問題,但這確實很有效 
**來看下面的問題: 
1.檢查一個單詞是否拼寫正確->看它是否在已經字典中 
2.網絡爬蟲->一個網址是否訪問過 
3.郵件過濾,建立那些發垃圾郵件的地址的黑名單**

你可能會說哈希表不就行了嗎,但在2,3的問題中,網頁和垃圾郵件地址全球動不動便是幾十億那,哈希的存儲效率也就50%左右 
一億Email(一個佔16字節)約爲1.6GB內存,要是幾十億個地址就幾百GB,誰家這麼有錢,都去建天河二號 
所以啊,能不能少花點內存來幹這事:於是布隆過濾器來了,只要12.5%到25%的哈希表空間就能幹這事,但是有點小錯誤,這個小錯誤概率太小就基本不擔心了

工作原理: 
一億Email => 16億二進制(bit)==2億字節(哈希就是16億字節了)

1.先全部位清0,對每一個電子郵件地址X,用8個不同的隨機數產生器(F1,F2,..F8)產生8個信息指紋(比如md5),

2.然後用一個統一的隨機數產生器G把這8個信息指紋=>8個自然數g1,g2,g3..,g8,這些位置上的位置爲1

1億個地址放入建好這個布隆過濾器

然後新來一個,同樣處理,對應8個二進制位 t1,t2,…,t8 
如果全爲1,好的=>判定位垃圾郵件

你會想了,這樣靠譜不,萬一把非垃圾郵件誤判了咋辦

我們來看看誤判的概率: 
先來算任何一個位被置爲1的概率p,這樣你可以簡單的就知道 
新來一個,有8個位,如果被誤判了,此時這8個位全爲1,其概率爲

p8

我們來推到下一般的情況,假設有m個位,n個元素,有k個哈希函數, 
針對單個元素插入來說: 
11/m

K111/m)k

111/m)kn

1111/m)kn

同樣的新來一個,要命中其概率爲: 
1[11/m]kn)k1ekn/m)k 
上次k=8,n/m=1/16,計算值大約在萬分之五,誤判率非常低,基本可容忍。*
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章