探索C 之布隆過濾器 Bloom filter

2022-01-17 11:49:49 字數 2229 閱讀 3514

背景介紹

演算法原理

誤判率bf改進

總結bloom filter(後面簡稱bf)是bloom在2023年提出的二進位制向量資料結構。通俗來說就是在大資料集合下高效判斷某個成員是否屬於這個集合。bf其優點在於:

而使用bf可以最大限度避免上述缺點,使其可以在更小空間上,進行高效插入和查詢。

經常使用快取的肯定知道,命中率是個永遠的話題。 特別是在分布式快取中,每次不命中就意味著一次跨網路通訊的浪費,無故增加快取伺服器壓力。使用bf可以在很大程度上提高快取命中率。

bf很合適解決類似上面的問題。 bf和例子1中的第三種方法非常類似了。不同的是,bf對同乙個郵件位址使用多個不同的hash函式,再去對映位陣列的中對應位置。

演算法步驟:

建立長度為m的位陣列,全部置為0。

取出郵件位址集合(m)中的某乙個位址(a), 分別使用k個hash函式對a計算。

將結果分別對映到位陣列中,並設定為1。

其他成員依次處理。

以函式個數k=8來算,50億個郵件位址只需要5g記憶體足夠了,比例子1中方法2節省32倍空間。

當查詢成員a時是否在垃圾郵件集合m中時,使用同樣k個hash函式進行計算,如果k個結果在位陣列中的位值都是1,則判斷a屬於m集合中,即a郵件位址屬於垃圾郵件位址集合m(a∈m)。

關於例子2,可以將所有key儲存到本地記憶體中,每次遠端獲取快取時,優先在記憶體集合中判斷是否存在。

存在?去遠端獲取實際快取內容。

不存在?直接返回,無需再去遠端快取伺服器判斷。

這樣能極大提高快取命中率,因為bf存在誤判率,所有並不能達到100%(在key的數量級不高時,用其他方法全存下來也可以)。如圖:

因為bf使用hash函式來取得成員的特徵(可理解為成員的指紋資訊),並沒有在位陣列中儲存集合內的實際資料內容,所以空間利用率極高,但存在個潛在問題,就是查詢某個成員是否屬於集合時,會發生誤判(false positive)。 也就是說,某個成員實際不在集合中,但bf會得出在集中的結論。 所以bf適用於允許發生一定誤判的場景,如例子1、2中少量過濾失敗或去伺服器拿都是可以接受的。

為什麼會有誤判?

假定有乙個長度12的位陣列,使用3個hash函式,根據演算法計算成員a得出3、7、11位置,並在位陣列中設定為1。 另外個成員b根據演算法也計算得出3、7、11,去位陣列檢查其位值時,就發現3、7、11都為1是存在的,而實際不存在(1是成員a設定的),此時就發生了誤判現象。

bf會發生誤判,但不會發生漏判(false negative),即成員實際在集合中,那麼bf一定能判斷出在集合中,因為成員對應的位置都設定為1了。

可控制性

根據其陣列長度m、集合大小n、hash函式個數k、誤判率p,簡單得出下:

其他不變,集合大小n越大,越多位被設定1,誤判率p越大。

其他不變,陣列漲肚m越大,剩餘為0的位越多,誤判率p越小

其他不變,新增時k越多,位陣列越多被設定為1,即會增大誤判率。查詢時k越多,明顯誤判率可能就會越小。

hash函式個數取值公式 k = ln 2 * m/n 。

其他它關係公式見wiki。

基本的bf在使用時有個缺點:無法刪除集合成員a,只能增加其成員並對其查詢。 有乙個很容易想到但錯誤的方法是:如果要刪除成員a,那麼先用k個hash函式對其計算,因為a已經是集合成員,那麼其對應的位陣列的位置一定被設定為1,所以只要將對應位置重新設定為0即可。   原因就是位陣列的位置不但只提供給a使用,也給其他成員使用,一旦設定為0就會影響其他成員的使用。

比如上面中提高快取命中率的例子,不能刪除成員意味著實際快取也不能刪除。如果實際快取刪除了,而在集合中的資料無法刪除,就會發生漏判現象。 這樣的話就會大大限制bf的使用場景。

計數bf是對基本bf的改進,使bf可以支援刪除成員。  因為bf的基本單位是1個bit,只能表達2種狀態,即存在、不存在。 如果把基本單位1bit拓展成多個bit,這樣就能增加更多資訊,表達出多種狀態。

計數bf的基本單元由多個bit表示,一般情況為3、4個bit。  這樣在新增時,在陣列位置上的數值上加1即可,刪除成員時-1即可。 查詢集合成員時保持不變,只要數值不為0即認為成員是存在的。

計數bf使基本bf有了更多應用場景。 同樣由於用了多個bit來表示,對應陣列大小也相應增加,如果用3bit作為基本單位,那麼陣列大小對應增加了3倍。

bf是大資料處理的利器,其使用場景非常多:

基本bf的具體實現可參考

[1] 

[2] 

C 布隆過濾器

我們在玩手機的時候,軟體會給我們推送一些新訊息,軟體如何保證我們哪些訊息看過,哪些訊息沒看過呢?解決辦法 用乙個伺服器記錄我們看過的內容,為了保證能夠快速查詢,我們可以使用雜湊表儲存使用者資訊,但是浪費空間,我們使用位圖進行儲存,但是不能解決雜湊衝突,將雜湊表與位圖結合 布隆過濾器。是一種概率性資料...

布隆過濾器

布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...

布隆過濾器

布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...