每個程序員都應該掌握的數據結構 – Bloom Filter

Bloom Filter

這種數據結構的名字來源于他的發明人Burton Howard Bloom的名字,凡是用自己名字命名的東西一般都非常牛逼,思維精巧,獨步武林。

Bloom Filter跟hash有著緊密的關聯。首先設想我們有一個比較大的數據集合,每一條記錄有一個key,現在有一個需求是問給定一個key,這個集合包含不包含這個數據?我們不太可能不假思索的把整個數據集合load進內存中,因為可能存在多個這樣的數據集合。最容易想到也最直接的想法是在內存中構造一個hash的結構保存所有已經存在的key,這其實已經能夠解決絕大多數的問題了,但是有沒有更好的呢?乍一看對普通人來說不太容易找到突破口,這確實需要非凡的智慧來打破定式思維。Bloom Filter就設計了這樣一種思路,它找到了一種折中,以一定概率的錯誤回答來實現比常規hash表小的多的內存使用量。直白的來說就是當我們問數據集包含不包含key的數據的時候,如果它回答不包含,那100%數據集不包含,但是如果它回答包含的話,卻不是一個確定的答案,我們需要進一步的策略去確定它是不是真的包含,牛逼的地方在于這個出錯的概率我們是自己可以控制的。

讓我們先從一個很笨的但是樸素的方法開始,假設我們知道數據集有1000萬條數據,如果我們設計一種很差的hash算法,使得這1000萬條數據只有1萬個hash值,常規的hash表用鏈表的結構解決hash沖突的問題,所以即使只有1萬個hash值,如果我們用常規的hash表來保存所有key在內存中的話,內存仍然是1000萬個key的大小,如果我們的數據結構不解決hash沖突呢?只load這1萬個hash值在內存中,那么當有詢問一個key在不在這個集合中的時候,很明顯如果hash(k)不在這1萬個值中,那么這個key一定不在這個數據集合中,hash(k)在的話,那么有可能是包含這個key的,因為我們沒解決hash沖突,很明顯的直覺告訴我們hash值越多,回答出錯的概率就會越低,但是如果沿著這個思路下去的話,我們依然會陷入死胡同,因為你的hash函數越完美,就越需要更多的內存來保存hash值。

讓我們再次回到一個基本認知邏輯中,現實生活中,我們經常看到一些娛樂節目玩一種你說我猜的游戲,就是給定一個物品,一個人去描述它的特征,另一個人來回答它是什么,一種食物,圓的,中秋節吃的,那么很容易猜到是月餅,我們模仿這種思路用一組hash函數hash1,hash2 …來為一個key算出一組hash值,然后用一種有效的數據結構來保存這組hash值,當再有詢問一個key在不在的時候,我們同時判斷hash1(key),hash2(key)…都在不在已經我們的的數據結構里來回答這個key在不在,我們依然依靠直覺這樣的判斷應該出錯的幾率會降低了,談到有效的,內存敏感的,數相關的數據結構我們應該馬上會回想到bitset,Bloom Filter正是依賴著這種數據結構來存儲所有的hash值,每個hash(key)都對應著一個bit位。

現在讓我們更準確的定義這種數據結構,給定n個元素的集合,k個hash函數,m大小bitset來存儲所有的hash值,使得當詢問一個key是否在集合中的時候以確定的概率p回答錯誤。以下只包含經過了嚴格的數學證明的結論,我們程序員可以直接拿來使用。

n和p是我們可以決定的,當我們選定這兩個參數以后,下列公式可以幫我們確定m,

根據概率確定m

當m確定后,我們用下列公式確定k,


根據m和n確定k

當這些變量都確定后,我們需要去設計一組hash函數,我們可以直接拿算法導論Designing a universal class of hash functions章節去實現我們的k個hash函數。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容

  • 教你如何迅速秒殺掉:99%的海量數據處理面試題 本文經過大量細致的優化后,收錄于我的新書《編程之法》第六章中,新書...
    Helen_Cat閱讀 7,444評論 1 39
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,736評論 24 1,002
  • 第一部分、十道海量數據處理面試題 1、海量日志數據,提取出某日訪問百度次數最多的那個IP。 此題,在我之前的一篇文...
    零一間閱讀 930評論 0 5
  • 海量數據處理,就是在海量數據上的存儲、處理、操作。海量的意思就是數據量太大,所以導致要么是無法在較短時間內迅速解決...
    seriously_1閱讀 1,173評論 0 1
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 有時候需要知道某個設備上還有多少磁盤空...
    SnailTyan閱讀 655評論 0 1