布隆過濾器

2021-10-25 11:20:04 字數 1306 閱讀 6664

布隆過濾器(bloom filter)是2023年由布隆提出的。它實際上是乙個很長的二進位制向量(位圖)和一系列隨機對映函式(雜湊函式)。

布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。

需要判斷某個資料是否在集合中,同時記憶體不夠且檢索速度慢的情況下,不妨考慮下布隆過濾器,但業務上要可以忍受判斷失誤率。

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶、樹、雜湊表(又叫雜湊表,hash table)等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。

當乙個元素被加入集合時,通過k個hash函式將這個元素對映成乙個位陣列(bitmap,這個陣列中每乙個位置只占有1個bit,而每個bit只有0和1兩種狀態)中的k個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何乙個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。(由於當輸入物件過多,而位陣列也就是bitmap過小,則會出現大部分為黑的情況,那樣就容易發生誤判!因此使用布隆過濾器是需要容忍錯誤率的。)

通過上面的描述,我們可以知道,如果輸入量過大,而bitarray空間的大小又很小,那麼誤判率就會上公升。那麼bitarray空間大小怎麼確定呢?可以根據以下推導公式計算

假設輸入物件個數為nbitmap大小(也就是布隆過濾器大小)為m,所容忍的誤判率p和雜湊函式的個數k。計算公式如下:(小數向上取整)

m =−

n∗ln

p(ln

2)

2m =- \frac^2}

m=−(ln

2)2n

∗lnp​k=

ln2∗

mn

=0.7∗m

nk=ln2*\frac=0.7*\frac

k=ln2∗

nm​=

0.7∗

nm​p=(

1−e−

nkm)

kp=(1-e^})^

p=(1−e

−mnk

​)k

注意:由於我們計算的m和k可能是小數,那麼需要經過向上取整,此時需要重新計算誤判率p!

參考:

布隆過濾器

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

布隆過濾器

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

布隆過濾器

如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...