布隆過濾器 Bloom Filter

2022-07-09 17:06:08 字數 1865 閱讀 1538

布隆過濾器(bloom filter)是一種基於hash的高效查詢資料結構,它能夠快速答覆「某個元素是否存在」的問題。布隆過濾器只能用於新增元素與查詢元素,不能夠用於刪除元素。

在布隆過濾器之前,使用的是基於hash的快速查詢演算法。hash可以將乙個元素進行雜湊,然後根據雜湊值對映到陣列的某乙個位置。並且根據hash演算法的優劣,不同元素對映到相同位置的可能性不同。但是如果基於hash的快速查詢演算法的陣列大小被限制在一定的範圍內,那麼發生雜湊衝突的概率將會變大。並且陣列範圍越小,衝突概率將越大。因此布隆過濾器採用了使用多個hash函式進行運算來提高空間利用率。

布隆過濾器是由乙個可變長度為n的二進位制陣列與一組數量可變m的雜湊函式構成。其中,雜湊函式為確定性函式,所有雜湊函式的輸出值都在1~n之間,與二進位制陣列相對應。因此,每乙個元素使用布隆過濾器的雜湊函式進行運算都將會得到相同的結果。

假設我們需要插入乙個元素到布隆過濾器中,我們需要使用不同的雜湊函式進行運算生成不同的雜湊值,並且根據生成的雜湊值將二進位制陣列對應的bit位置為1.例如插入字串"bloom"到過濾器中,使用三種雜湊函式進行計算所得到的雜湊值分別為1,3,7,那麼布隆過濾器的二進位制陣列則會變為:

假設我們插入第二個字串"filter"到過濾器中,同樣,我們使用相同的雜湊函式進行運算,假設雜湊值分別為2,4,7,那麼二進位制陣列則會變為:

因為在插入第乙個字串時,雜湊值為7的bit位置已經被置為1,因此不需要更改,只需要將bit位為2,4置為1即可。

假設需要查詢某個元素是否存在,只需要使用相同的雜湊函式進行運算,然後與二進位制陣列進行bit值匹配即可。比如,我們需要查詢字串"hash"是否存在,使用之前的雜湊函式進行運算,假設輸出的雜湊值為4,5,7,由於bit位為5的位置仍然為0,所以對於字串"hash"並不存在。

但是如果運算的雜湊值為2,3,7,我們也只能說該字串有可能存在。因為隨著儲存的陣列越多,將會有越多的bit位被置為1,即使某個字串沒有儲存,但是有可能該字串的雜湊值與其他被儲存的資料雜湊值重複,仍然可能誤判為該字串存在。

因此,對於查詢某個元素,只能判定某個元素一定不存在或者有可能存在,並不能判定某個元素一定存在

因此需要設定合適的陣列長度與雜湊函式數量。

雜湊函式數量也會影響過濾效率.

可以通過以下公式計算合適的陣列長度與雜湊函式數量:

其中k為雜湊函式個數,m為布隆過濾器長度,n為插入的元素個數,p為誤報率。

實際上,無論是 hash,還是布隆過濾器,基本思想是一致的,

參考文獻:

spark 布隆過濾器 bloomFilter

資料過濾在很多場景都會應用到,特別是在大資料環境下。在資料量很大的場景實現過濾或者全域性去重,需要儲存的資料量和計算代價是非常龐大的。很多小夥伴第一念頭肯定會想到布隆過濾器,有一定的精度損失,但是儲存效能和計算效能可以達到幾何級別的提公升。很多第三方框架也實現了相應的功能,比如hbase框架實現的布...

布隆過濾器

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

布隆過濾器

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