每個(gè)程序員都應(yīng)該掌握的數(shù)據(jù)結(jié)構(gòu) – Bloom Filter

Bloom Filter

這種數(shù)據(jù)結(jié)構(gòu)的名字來(lái)源于他的發(fā)明人Burton Howard Bloom的名字,凡是用自己名字命名的東西一般都非常牛逼险毁,思維精巧疙教,獨(dú)步武林。

Bloom Filter跟hash有著緊密的關(guān)聯(lián)乎完。首先設(shè)想我們有一個(gè)比較大的數(shù)據(jù)集合,每一條記錄有一個(gè)key品洛,現(xiàn)在有一個(gè)需求是問(wèn)給定一個(gè)key,這個(gè)集合包含不包含這個(gè)數(shù)據(jù)摩桶?我們不太可能不假思索的把整個(gè)數(shù)據(jù)集合load進(jìn)內(nèi)存中桥状,因?yàn)榭赡艽嬖诙鄠€(gè)這樣的數(shù)據(jù)集合。最容易想到也最直接的想法是在內(nèi)存中構(gòu)造一個(gè)hash的結(jié)構(gòu)保存所有已經(jīng)存在的key硝清,這其實(shí)已經(jīng)能夠解決絕大多數(shù)的問(wèn)題了辅斟,但是有沒(méi)有更好的呢?乍一看對(duì)普通人來(lái)說(shuō)不太容易找到突破口芦拿,這確實(shí)需要非凡的智慧來(lái)打破定式思維士飒。Bloom Filter就設(shè)計(jì)了這樣一種思路查邢,它找到了一種折中,以一定概率的錯(cuò)誤回答來(lái)實(shí)現(xiàn)比常規(guī)hash表小的多的內(nèi)存使用量酵幕。直白的來(lái)說(shuō)就是當(dāng)我們問(wèn)數(shù)據(jù)集包含不包含key的數(shù)據(jù)的時(shí)候扰藕,如果它回答不包含,那100%數(shù)據(jù)集不包含芳撒,但是如果它回答包含的話(huà)邓深,卻不是一個(gè)確定的答案,我們需要進(jìn)一步的策略去確定它是不是真的包含笔刹,牛逼的地方在于這個(gè)出錯(cuò)的概率我們是自己可以控制的芥备。

讓我們先從一個(gè)很笨的但是樸素的方法開(kāi)始,假設(shè)我們知道數(shù)據(jù)集有1000萬(wàn)條數(shù)據(jù)舌菜,如果我們?cè)O(shè)計(jì)一種很差的hash算法萌壳,使得這1000萬(wàn)條數(shù)據(jù)只有1萬(wàn)個(gè)hash值,常規(guī)的hash表用鏈表的結(jié)構(gòu)解決hash沖突的問(wèn)題日月,所以即使只有1萬(wàn)個(gè)hash值袱瓮,如果我們用常規(guī)的hash表來(lái)保存所有key在內(nèi)存中的話(huà),內(nèi)存仍然是1000萬(wàn)個(gè)key的大小山孔,如果我們的數(shù)據(jù)結(jié)構(gòu)不解決hash沖突呢懂讯?只load這1萬(wàn)個(gè)hash值在內(nèi)存中,那么當(dāng)有詢(xún)問(wèn)一個(gè)key在不在這個(gè)集合中的時(shí)候台颠,很明顯如果hash(k)不在這1萬(wàn)個(gè)值中褐望,那么這個(gè)key一定不在這個(gè)數(shù)據(jù)集合中,hash(k)在的話(huà)串前,那么有可能是包含這個(gè)key的瘫里,因?yàn)槲覀儧](méi)解決hash沖突,很明顯的直覺(jué)告訴我們hash值越多荡碾,回答出錯(cuò)的概率就會(huì)越低谨读,但是如果沿著這個(gè)思路下去的話(huà),我們依然會(huì)陷入死胡同坛吁,因?yàn)槟愕膆ash函數(shù)越完美劳殖,就越需要更多的內(nèi)存來(lái)保存hash值。

讓我們?cè)俅位氐揭粋€(gè)基本認(rèn)知邏輯中拨脉,現(xiàn)實(shí)生活中哆姻,我們經(jīng)常看到一些娛樂(lè)節(jié)目玩一種你說(shuō)我猜的游戲玫膀,就是給定一個(gè)物品矛缨,一個(gè)人去描述它的特征,另一個(gè)人來(lái)回答它是什么,一種食物箕昭,圓的灵妨,中秋節(jié)吃的,那么很容易猜到是月餅落竹,我們模仿這種思路用一組hash函數(shù)hash1泌霍,hash2 …來(lái)為一個(gè)key算出一組hash值,然后用一種有效的數(shù)據(jù)結(jié)構(gòu)來(lái)保存這組hash值筋量,當(dāng)再有詢(xún)問(wèn)一個(gè)key在不在的時(shí)候烹吵,我們同時(shí)判斷hash1(key),hash2(key)…都在不在已經(jīng)我們的的數(shù)據(jù)結(jié)構(gòu)里來(lái)回答這個(gè)key在不在,我們依然依靠直覺(jué)這樣的判斷應(yīng)該出錯(cuò)的幾率會(huì)降低了桨武,談到有效的肋拔,內(nèi)存敏感的,數(shù)相關(guān)的數(shù)據(jù)結(jié)構(gòu)我們應(yīng)該馬上會(huì)回想到bitset呀酸,Bloom Filter正是依賴(lài)著這種數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)所有的hash值凉蜂,每個(gè)hash(key)都對(duì)應(yīng)著一個(gè)bit位。

現(xiàn)在讓我們更準(zhǔn)確的定義這種數(shù)據(jù)結(jié)構(gòu)性誉,給定n個(gè)元素的集合窿吩,k個(gè)hash函數(shù),m大小bitset來(lái)存儲(chǔ)所有的hash值错览,使得當(dāng)詢(xún)問(wèn)一個(gè)key是否在集合中的時(shí)候以確定的概率p回答錯(cuò)誤纫雁。以下只包含經(jīng)過(guò)了嚴(yán)格的數(shù)學(xué)證明的結(jié)論,我們程序員可以直接拿來(lái)使用倾哺。

n和p是我們可以決定的轧邪,當(dāng)我們選定這兩個(gè)參數(shù)以后,下列公式可以幫我們確定m羞海,

根據(jù)概率確定m

當(dāng)m確定后忌愚,我們用下列公式確定k,


根據(jù)m和n確定k

當(dāng)這些變量都確定后却邓,我們需要去設(shè)計(jì)一組hash函數(shù)硕糊,我們可以直接拿算法導(dǎo)論Designing a universal class of hash functions章節(jié)去實(shí)現(xiàn)我們的k個(gè)hash函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腊徙,一起剝皮案震驚了整個(gè)濱河市简十,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撬腾,老刑警劉巖勺远,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異时鸵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)饰潜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)初坠,“玉大人,你說(shuō)我怎么就攤上這事彭雾〉蹋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵薯酝,是天一觀的道長(zhǎng)半沽。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吴菠,這世上最難降的妖魔是什么者填? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮做葵,結(jié)果婚禮上占哟,老公的妹妹穿的比我還像新娘。我一直安慰自己酿矢,他們只是感情好榨乎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘫筐,像睡著了一般蜜暑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上策肝,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天肛捍,我揣著相機(jī)與錄音,去河邊找鬼驳糯。 笑死篇梭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酝枢。 我是一名探鬼主播恬偷,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帘睦!你這毒婦竟也來(lái)了袍患?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竣付,失蹤者是張志新(化名)和其女友劉穎诡延,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體古胆,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肆良,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年筛璧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惹恃。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡夭谤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巫糙,到底是詐尸還是另有隱情朗儒,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布参淹,位于F島的核電站醉锄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏浙值。R本人自食惡果不足惜恳不,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望亥鸠。 院中可真熱鬧妆够,春花似錦、人聲如沸负蚊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)家妆。三九已至鸵荠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伤极,已是汗流浹背蛹找。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哨坪,地道東北人庸疾。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像当编,于是被迫代替她去往敵國(guó)和親届慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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

  • 教你如何迅速秒殺掉:99%的海量數(shù)據(jù)處理面試題 本文經(jīng)過(guò)大量細(xì)致的優(yōu)化后忿偷,收錄于我的新書(shū)《編程之法》第六章中金顿,新書(shū)...
    Helen_Cat閱讀 7,427評(píng)論 1 39
  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒(méi)有聽(tīng)過(guò)Nginx?那么一定聽(tīng)過(guò)它的“同行”Apache吧鲤桥!Ngi...
    JokerW閱讀 32,700評(píng)論 24 1,002
  • 第一部分揍拆、十道海量數(shù)據(jù)處理面試題 1、海量日志數(shù)據(jù)茶凳,提取出某日訪問(wèn)百度次數(shù)最多的那個(gè)IP嫂拴。 此題播揪,在我之前的一篇文...
    零一間閱讀 924評(píng)論 0 5
  • 海量數(shù)據(jù)處理,就是在海量數(shù)據(jù)上的存儲(chǔ)筒狠、處理剪芍、操作。海量的意思就是數(shù)據(jù)量太大窟蓝,所以導(dǎo)致要么是無(wú)法在較短時(shí)間內(nèi)迅速解決...
    seriously_1閱讀 1,170評(píng)論 0 1
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡(jiǎn)書(shū) 有時(shí)候需要知道某個(gè)設(shè)備上還有多少磁盤(pán)空...
    SnailTyan閱讀 645評(píng)論 0 1