轉自:談談布隆過濾器,保存在此以學習。
之前就閱讀過數學之美,知道有這麼個基礎的算法,可是因爲不常用到也就沒當回事,最近重新看到它覺得很高大上,就想來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,其概率爲
我們來推到下一般的情況,假設有m個位,n個元素,有k個哈希函數,
針對單個元素插入來說:
同樣的新來一個,要命中其概率爲:
1−[1−1/m]kn)k近似(1−e−kn/m)k
上次k=8,n/m=1/16,計算值大約在萬分之五,誤判率非常低,基本可容忍。*