布隆過濾器(bloom filter)是2023年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。
google 爬蟲 它要判斷。哪些網頁是被爬過來了的。
如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路. 但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢(o(n),o(logn))。不過世界上還有一種叫作雜湊表(又叫雜湊表,hash table)的資料結構(有乙個動態陣列,+ 乙個 hash 函式)。它可以通過乙個 hash 函式將乙個元素對映成乙個位陣列(bit array)中的乙個點。這樣一來,我們只要看看這個點是不是 1 就可以知道集合中有沒有它了。這就是布隆過濾器的基本思想。
hash 面臨的問題就是衝突。假設 hash 函式是良好的,如果我們的位陣列長度為 m 個點,那麼如果我們想將衝突率降低到例如 1%, 這個雜湊表就只能容納 m / 100 個元素。顯然這就不叫空間效率了(space-efficient)了。解決方法也簡單,就是使用多個 hash,如果它們有乙個說元素不在集合中,那肯定就不在。如果它們都說在,雖然也有一定可能性它們在說謊,不過直覺上判斷這種事情的概率是比較低的。
bloom filter 是一種空間效率很高的隨機資料結構,它利用位陣列很簡潔地表示乙個集合,並能判斷乙個元素是否屬於這個集合。bloom filter 的這種高效是有一定代價的:在判斷乙個元素是否屬於某個集合時,有可能會把不屬於這個集合的元素誤認為屬於這個集合(false positive)。因此,bloom filter 不適合那些「零錯誤」的應用場合。而在能容忍低錯誤率的應用場合下,bloom filter 通過極少的錯誤換取了儲存空間的極大節省
總結起來說:bloomfilter,布隆過濾器:迅速判斷乙個元素是不是在乙個龐大的集合內,但是他有乙個弱點:它有一定的誤判率
誤判率:原本不存在於該集合的元素,布隆過濾器有可能會判斷說它存在,但是,如果布隆過濾器判斷說某乙個元素不存在該集合,那麼該元素就一定不在該集合內
相比於其它的資料結構,布隆過濾器在空間和時間方面都有巨大的優勢。布隆過濾器儲存空間和插入/查詢時間都是常數。另外, hash 函式相互之間沒有關係,方便由硬體並行實現。布隆過濾器不需要儲存元素本身,在某些對保密要求非常嚴格的場合有優勢。
布隆過濾器可以表示全集,其它任何資料結構都不能;
k 和 m 相同,使用同一組 hash 函式的兩個布隆過濾器的交並差運算可以使用位操作進行。
能快速的判斷元素存在不存在
遠遠的縮小儲存資料的規模
但是布隆過濾器的缺點和優點一樣明顯。誤算率是其中之一。隨著存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用雜湊表足矣。
另外,一般情況下不能從布隆過濾器中刪除元素。我們很容易想到把位列陣變成整數陣列,每插入乙個元素相應的計數器加 1, 這樣刪除元素時將計數器減掉就可以了。然而要保證安全的刪除元素並非如此簡單。首先我們必須保證刪除的元素的確在布隆過濾器裡面. 這一點單憑這個過濾器是無法保證的。另外計數器迴繞也會造成問題。在降低誤算率方面,有不少工作,使得出現了很多布隆過濾器的變種。
存在一定的誤判率,那麼在你不能容忍有錯誤率的情況,布隆過濾器不適用
布隆過濾器不支援刪除操作
布隆過濾器需要的是乙個位陣列(和點陣圖類似, bytes 陣列)和 k 個對映函式(和 hash 表類似),在初始狀態時,對於長度為 m 的位陣列 array,它的所有位被置 0。
對於有 n 個元素的集合 s=,通過 k 個對映函式,將集合 s 中的每個元素sj(1<=j<=n) 對映為 k 個 值 , 然 後 再 將 位 數 組 array 中 相 對 應 的array[g1],array[g2]......array[gk]置為 1:
前兩次是插入,插入的資料是「huangbo」「wangbaoqiang」
「huangbo」.hashcode1() => 2
「huangbo」.hashcode2() => 4
「wangbaoqiang」 .hashcode1() => 3
「wangbaoqiang」 .hashcode2() => 4
查詢:「xuzheng」
「xuzheng」. hashcode1() => 4 有可能存在,有可能不存在,就算全部結果都是 1,也有可能不存在
「xuzheng」. hashcode2() => 1 能百分百確定,這個值一定不存在
只要所有的 hash 函式計算出來的值裡面有乙個值是 0 ,,我們就能確定這個 key = 「xuzheng」他一定不存在與我們的集合裡面
自定義乙個布隆過濾器的時候需要做的事情:
1、 初始化乙個位陣列
2、 實現 k 個 hash 函式
3、 實現查詢,和 插入操作
查詢和插入操作需要做的事情:
對插入進來的值進行 hash 計算,有幾個 hash 函式,就計算幾次,每次計算出來的結果值,都根據這個值,去位陣列裡面把相應位置的 0 變成 1
對查詢操作來說,只需要把你要查詢的這個 key 值進行 k 個 hash 函式的呼叫,然後再判斷計算出來的這個 k 個值對應的維陣列上的值是不是有乙個為 0,,,如果有乙個為 0,那就表示,該 key 不在這個集合裡面
n 個 hashcode() , n 位的 0 變成 1
要查詢某個元素 item 是否在 s 中,則通過對映函式得到 k 個值,然後再判斷 array[g1],array[g2]...array[gk]是否都為 1,若全為 1,則 item 在 s 中,否則 item 不在 s中。這個就是布隆過濾器的實現原理。
前面說到過,布隆過濾器會造成一定的誤判,因為集合中的若干個元素通過對映之後得到的數值恰巧包括 g1,g2,...gk,在這種情況下可能會造成誤判,但是概率很小。
布隆過濾器
布隆過濾器 bloom filter 是1970年由布隆提出的。它實際上是乙個很長的二進位制向量和一系列隨機對映函式。布隆過濾器可以用於檢索乙個元素是否在乙個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。如果想要判斷乙個元素是不是在乙個集合裡,一般想到...
布隆過濾器
布隆過濾器的概念 如果想要判斷乙個元素是不是在乙個集合裡,一般想到的是將所有元素儲存起來,然後通過比較確定。鍊錶,樹等等資料結構都是這種思路.但是隨著集合中元素的增加,我們需要的儲存空間越來越大,檢索速度也越來越慢 o n o logn 不過世界上還有一種叫作雜湊表 又叫 雜湊表,hash tabl...
布隆過濾器
如果想判斷乙個元素是不是在乙個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鍊錶 樹 雜湊表 又叫雜湊表,hash table 等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。bloom filter 是一種空間效率很高的隨機...