布隆過濾器(Bloom filter)

Hash Table 的弊端

在日常生活中,包括在設(shè)計(jì)計(jì)算機(jī)軟件時(shí),我們經(jīng)常要判斷一個(gè)元素是否在一個(gè)集合中林螃。比如:

  • 在字處理軟件中,需要檢查一個(gè)英語單詞是否拼寫正確(也就是要判斷它是否在已知的字典中)
  • 在 FBI俺泣,一個(gè)嫌疑人的名字是否已經(jīng)在嫌疑名單上
  • 在網(wǎng)絡(luò)爬蟲里治宣,一個(gè)網(wǎng)址是否被訪問過等等
  • yahoo,gmail 等郵箱垃圾郵件過濾功能

最直接的方法就是將集合中全部的元素存在計(jì)算機(jī)中砌滞,遇到一個(gè)新元素時(shí)侮邀,將它和集合中的元素直接比較即可。一般來講贝润,計(jì)算機(jī)中的集合是用哈希表(Hash Table)來存儲(chǔ)的绊茧。它的好處是快速準(zhǔn)確,缺點(diǎn)是費(fèi)存儲(chǔ)空間打掘。當(dāng)集合比較小時(shí)华畏,這個(gè)問題不顯著,但是當(dāng)集合巨大時(shí)尊蚁,哈希表存儲(chǔ)效率低的問題就顯現(xiàn)出來了亡笑。

例如在需要處理 10 億個(gè)黑名單郵件地址列表的場景下,沒有郵件地址需要 8 個(gè)字節(jié)的信息指紋横朋,即需要 8GB 內(nèi)存仑乌,為了減少 Hash 沖突,還需要一定的 Hash 空間冗余琴锭,假如空間利用率為 50%晰甚,則需要 16GB 的內(nèi)存空間。

布隆過濾器

在對過濾要求不完全精確的場景下决帖,可用布隆過濾器代替 Hash 表厕九。布隆過濾器通過一個(gè)二進(jìn)制列表和一組隨機(jī)數(shù)映射函數(shù)實(shí)現(xiàn)

仍以需要處理 10 億郵件地址黑名單列表為例,在內(nèi)存中建立一個(gè) 2GB 大小的存儲(chǔ)空間地回,即 16G 個(gè)二進(jìn)制 bit扁远,并全部初始化為 0。要將一個(gè)郵箱地址加入黑名單時(shí)刻像,使用 8 個(gè)隨機(jī)映射函數(shù)(F1, F2, ..., F8) 對這個(gè)地址產(chǎn)生 0 ~ 16G 范圍內(nèi)的 8 個(gè)信息指紋(隨機(jī)數(shù))畅买,從而將該郵箱地址映射到 16G 二進(jìn)制存儲(chǔ)空間的 8 個(gè)位置上,然后將這些位置置為 1绎速。當(dāng)要檢查一個(gè)郵箱地址是否在黑名單中時(shí)皮获,使用同樣的映射函數(shù)焙蚓,得到 16G 空間 8 個(gè)位置的 bit纹冤,如果這些值都為 1洒宝,那么布隆過濾器認(rèn)為該郵箱地址在黑名單中

可以看到,處理同樣數(shù)量的信息萌京,布隆過濾器只要 Hash 表所需內(nèi)存的 1/8雁歌。但是布隆過濾器可能導(dǎo)致誤判。因?yàn)橐粋€(gè)郵箱地址映射的 8 個(gè) bit 可能正好都被其他郵箱地址設(shè)為 1 了知残。但是這種可能性很锌肯埂(上面的例子中,在誤識(shí)概率在萬分之一以下)求妹,通常在系統(tǒng)可接受范圍內(nèi)乏盐。如果需要精確的判斷,則不適合使用布隆過濾器

應(yīng)用

可以快速且空間效率高的判斷一個(gè)元素是否屬于一個(gè)集合制恍;用來實(shí)現(xiàn)數(shù)據(jù)字典父能,或者集合求交集。

Google chrome 瀏覽器使用 bloom filter 識(shí)別惡意鏈接(能夠用較少的存儲(chǔ)空間表示較大的數(shù)據(jù)集合净神,簡單的想就是把每一個(gè)URL都可以映射成為一個(gè)bit)何吝,并且誤判率在萬分之一以下

再如此題:

A, B 兩個(gè)文件,各存放 50 億條 URL鹃唯,每條 URL 占用 64 字節(jié)爱榕,內(nèi)存限制是 4G,讓你找出 A, B 文件共同的 URL坡慌。如果是三個(gè)乃至 n 個(gè)文件呢黔酥?

分析 :如果允許有一定的錯(cuò)誤率,可以使用 Bloom filter洪橘,4G 內(nèi)存大概可以表示 40 億 bit絮爷。將其中一個(gè)文件中的 url 使用 Bloom filter 映射為這 40 億 bit,然后挨個(gè)讀取另外一個(gè)文件的 url梨树,檢查是否與 Bloom filter坑夯,如果是,那么該 url 應(yīng)該是共同的 url(注意會(huì)有一定的錯(cuò)誤率)

布隆過濾器缺點(diǎn)

布隆過濾器的好處在于快速抡四,省空間柜蜈。但是有一定的誤識(shí)別率。隨著存入的元素?cái)?shù)量增加指巡,誤算率隨之增加淑履。但是如果元素?cái)?shù)量太少,則使用散列表足矣藻雪。常見的補(bǔ)救辦法是在建立一個(gè)小的白名單秘噪,存儲(chǔ)那些可能別誤判的信息

另外,一般情況下不能從布隆過濾器中刪除元素. 我們很容易想到把位數(shù)組變成整數(shù)數(shù)組勉耀,每插入一個(gè)元素相應(yīng)的計(jì)數(shù)器加 1指煎,這樣刪除元素時(shí)將計(jì)數(shù)器減掉就可以了蹋偏。然而要保證安全地刪除元素并非如此簡單。首先我們必須保證刪除的元素的確在布隆過濾器里面至壤。這一點(diǎn)單憑這個(gè)過濾器是無法保證的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末威始,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子像街,更是在濱河造成了極大的恐慌黎棠,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镰绎,死亡現(xiàn)場離奇詭異脓斩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)畴栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門俭厚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驶臊,你說我怎么就攤上這事挪挤。” “怎么了关翎?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵扛门,是天一觀的道長。 經(jīng)常有香客問我纵寝,道長论寨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任爽茴,我火速辦了婚禮葬凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘室奏。我一直安慰自己火焰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布胧沫。 她就那樣靜靜地躺著昌简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绒怨。 梳的紋絲不亂的頭發(fā)上纯赎,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音南蹂,去河邊找鬼犬金。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晚顷。 我是一名探鬼主播峰伙,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼音同!你這毒婦竟也來了词爬?” 一聲冷哼從身側(cè)響起秃嗜,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤权均,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锅锨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叽赊,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年必搞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了必指。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡恕洲,死狀恐怖塔橡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情霜第,我是刑警寧澤葛家,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泌类,受9級(jí)特大地震影響癞谒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刃榨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一弹砚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枢希,春花似錦桌吃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至呕屎,卻和暖如春让簿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秀睛。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工尔当, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓椭迎,卻偏偏與公主長得像锐帜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子畜号,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 布隆過濾器 (Bloom Filter) 詳解 原文鏈接:http://www.cnblogs.com/allen...
    JackChen1024閱讀 11,863評論 0 3
  • 首先看下面幾個(gè)場景: 字處理軟件中缴阎,需要檢查一個(gè)英語單詞是否拼寫正確 在 FBI,一個(gè)嫌疑人的名字是否已經(jīng)在嫌疑名...
    何笙閱讀 677評論 0 0
  • [TOC] 布隆過濾器的思想 -- 不追求完美 在quora上简软,有個(gè)問題問蛮拔,人們最常犯的錯(cuò)誤是哪些,其中一個(gè)就是...
    russelllei閱讀 1,113評論 0 6
  • 維基百科 布隆過濾器(Bloom Filter)是1970年由布隆提出的痹升。它實(shí)際上是一個(gè)很長的二進(jìn)制向量和一系列隨...
    網(wǎng)蟲子閱讀 564評論 0 1
  • 十七八歲的時(shí)候總覺得世界是自己的,總是堅(jiān)信察郁,努力了衍慎,就一定會(huì)有收獲,就像在山谷喊話皮钠,只要肺活量夠好稳捆,無論多大的風(fēng)力...
    簡黎黎閱讀 506評論 0 3