每個程序員都應該掌握的數(shù)據(jù)結構 – Bloom Filter

Bloom Filter

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

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

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

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

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

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

根據(jù)概率確定m

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


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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

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

友情鏈接更多精彩內容