布隆過濾器(bloom filter)是2023年由布隆提出的。它實際上是乙個很長的二進位制向量(位圖)和一系列隨機對映函式(雜湊函式)。需要判斷某個資料是否在集合中,同時記憶體不夠且檢索速度慢的情況下,不妨考慮下布隆過濾器,但業務上要可以忍受判斷失誤率。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶、樹、雜湊表(又叫雜湊表,hash table)等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。
當乙個元素被加入集合時,通過k個hash函式將這個元素對映成乙個位陣列(bitmap,這個陣列中每乙個位置只占有1個bit,而每個bit只有0和1兩種狀態)中的k個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何乙個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。(由於當輸入物件過多,而位陣列也就是bitmap過小,則會出現大部分為黑的情況,那樣就容易發生誤判!因此使用布隆過濾器是需要容忍錯誤率的。)
通過上面的描述,我們可以知道,如果輸入量過大,而bitarray空間的大小又很小,那麼誤判率就會上公升。那麼bitarray空間大小怎麼確定呢?可以根據以下推導公式計算
假設輸入物件個數為n
,bitmap
大小(也就是布隆過濾器大小)為m
,所容忍的誤判率p
和雜湊函式的個數k
。計算公式如下:(小數向上取整)
m =−
n∗ln
p(ln
2)
2m =- \frac^2}
m=−(ln
2)2n
∗lnpk=
ln2∗
mn
=0.7∗m
nk=ln2*\frac=0.7*\frac
k=ln2∗
nm=
0.7∗
nmp=(
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 是一種空間效率很高的隨機...