簡單、高效的數(shù)據(jù)結(jié)構(gòu)--Bloom Filter(布隆過濾器)

一倘零、布隆過濾器可以用來做什么

????????布隆過濾器可用來判定一個元素是否屬于一個集合戳寸,比如在一個大的集合A中,是否存在值a疫鹊。由于hash碰撞(兩個不同輸入值的hash值相同)的原因拆吆,在判定a是否存在于A中時可能會有誤判。如果判定結(jié)果是a不存在于A中枣耀,a肯定是不在A中;如果判定結(jié)果是存在,這時可能是因為與a的hash值相同其他元素存在于A中佩微,而a并不存在。

????????關(guān)于布隆過濾器的使用場景谷浅,大多是用來判定“是否需要繼續(xù)執(zhí)行讀取磁盤等效率低的操作”奶卓。比如,Google 的BitTable 和Apach HBase夺姑,都使用布隆過濾器判斷查詢的數(shù)據(jù)是否存在,來確定是否需要繼續(xù)讀取磁盤眉睹。再比如,用爬蟲抓取網(wǎng)頁時慕蔚,有些網(wǎng)頁會相互鏈接或者多個網(wǎng)頁含有同一網(wǎng)頁鏈接斋配,所以可以使用布隆過濾器判斷url是否爬取過了,來確定是否繼續(xù)發(fā)起該url的訪問艰争。

二、布隆過濾器是怎么實現(xiàn)和使用的

1惦积、如何實現(xiàn)

????????布隆過濾器由兩個部分組成:一個位數(shù)組(只有0猛频、1值)和一組散列函數(shù)。布隆過濾器在剛初始化時鹿寻,數(shù)組中的值都是0,假設(shè)數(shù)組長度是10:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

????????添加元素時坦敌,將元素作為輸入提供給散列函數(shù)痢法。 每個散列函數(shù)都將輸出一個數(shù)字作為數(shù)組索引,將索引對應(yīng)位置值更新為1蘸炸。 比如尖奔,將字符串“hello”傳遞給兩個散列函數(shù)f1,f2提茁,這兩個散列函數(shù)給出索引0和4,我們將位數(shù)組中的相應(yīng)位設(shè)置為1:

[1, 0, 0, 0, 1, 0, 0, 0, 0, 0]
2铃岔、如何使用

????????當查詢一個元素是否存在于集合時丹弱,也先將元素傳給兩個散列函數(shù)铲咨,獲得兩個索引后蜓洪,檢查數(shù)組中相應(yīng)位的值:

  • 如果兩個值中有0,即可判定該元素不在集合中摇天。所以恐仑,不一定需要檢查所有函數(shù)返回位的值,如果發(fā)現(xiàn)至少有一個值是0裳仆,那么即可判定該元素不在集合中。
  • 如果兩個值都是1纯丸,只可判定為“該元素可能在集合中”静袖,因為散列函數(shù)可能會產(chǎn)生碰撞。比如我們使用兩個函數(shù)獲取“bloom”的索引可能為1和9坠陈,獲取“filter”的索引可能為5和7捐康,而此時再去查詢“word”,會因為1和9已被“bloom”和“filter”已經(jīng)設(shè)置為1而產(chǎn)出碰撞解总。因此,我們不能100%確定查詢的元素在集合中。

三萍嬉、為什么布隆過濾器效率比較高

時間復(fù)雜度
  • 添加元素時壤追,由于不需要迭代位數(shù)組,而是簡單的設(shè)置索引位的值行冰,所以操作所花費的時間僅取決于散列函數(shù)的個數(shù)伶丐。對于對于k個哈希函數(shù)的布隆過濾器疯特,添加元素的時間復(fù)雜度為O(k) 。
  • 查詢元素時录别,對于k個哈希函數(shù)的布隆過濾器邻吞,只需要在位數(shù)組中檢查的索引數(shù)量有一個不變的上界,所以查詢元素的時間復(fù)雜度也為O(k)抱冷。
空間復(fù)雜度

????????由于不需要存儲元素旺遮,只需依賴一定長度的位數(shù)組判斷是否存在,并且數(shù)組長度的大小不也取決于集合中元素的多少趣效,可以在誤判率變大或效率變低的代價下減少存儲(位數(shù)組)。

四讯私、布隆過濾器有哪些缺點

????????主要缺點是有一定的誤判率西傀,所以隨著存入集合的元素的增加,誤判率也隨之增加娘锁。誤判率大小和三個指標有關(guān):位數(shù)組長度m饺鹃、集合長度n、散列函數(shù)個數(shù)k悔详,其之間關(guān)系可以參考文獻 ,該文獻證明了對于給定的m缝驳、n,當 k = ln(2)* m/n 時誤判率是最小的运怖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夏伊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吗购,更是在濱河造成了極大的恐慌砸狞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踱启,死亡現(xiàn)場離奇詭異研底,居然都是意外死亡,警方通過查閱死者的電腦和手機冠蒋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門抖剿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來识窿,“玉大人,你說我怎么就攤上這事喻频。” “怎么了锻煌?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵姻蚓,是天一觀的道長。 經(jīng)常有香客問我,道長圆兵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任刀脏,我火速辦了婚禮超凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轮傍。我一直安慰自己,他們只是感情好杭跪,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布涧尿。 她就那樣靜靜地躺著檬贰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翁涤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天限书,我揣著相機與錄音章咧,去河邊找鬼。 笑死扰柠,一個胖子當著我的面吹牛疼约,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播程剥,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舔腾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哗脖,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤才避,失蹤者是張志新(化名)和其女友劉穎氨距,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衔蹲,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡舆驶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拘荡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撬陵。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蟋定,靈堂內(nèi)的尸體忽然破棺而出草添,到底是詐尸還是另有隱情,我是刑警寧澤远寸,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布驰后,位于F島的核電站,受9級特大地震影響灶芝,放射性物質(zhì)發(fā)生泄漏唉韭。R本人自食惡果不足惜犯犁,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一纽哥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栖秕,春花似錦、人聲如沸晓避。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俏拱。三九已至暑塑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間锅必,已是汗流浹背事格。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搞隐,地道東北人驹愚。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像劣纲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子癞季,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361