標籤:不能 原理 初始 增加 結構 技術分享 空間 分享圖片 過濾
Bloom Filter是一種空間效率很高的隨機資料結構,它利用位元組很簡潔地表示一個集合,並能判斷一個元素是否可能屬於這個集合。
它的優點是空間效率和查詢時間都遠遠超過一般的演算法,缺點是有一定的誤識別率和刪除困難。
初始狀態時,Bloom Filter是一個包含m位的位元組,每一位都置為0。
對於n個元素的集合,Bloom Filter使用k個相互獨立的雜湊函數,它們分別將集合中的每個元素映射到位元組中。對任意一個元素x,雜湊函數映射的位置就會被置為1。
如果一個位置多次被置為1,那麼只有第一次會起作用,後面幾次將沒有任何效果。
在中,k=3,也就是有3個相互獨立的雜湊函數,元素x1分別被映射到位置2,5,9,元素x2分別被映射到位置5,7,11。
如果要判斷某個元素x是否在這個集合裡,對x應用這k個雜湊函數,如果映射的位置都被置1了,就說明元素x可能在這個集合中,如果某一個位置為0,說明元素x一定不在這個集合中。
應用情境:
一組元素存在於磁碟中,資料量特別大,應用程式希望在元素不存在的時候盡量不讀磁碟,此時,可以在記憶體中構建這些磁碟資料的BloomFilter,對於一次讀資料的情況,分為以下幾種情況:
請求的元素不在磁碟中,如果BloomFilter返回不存在,那麼應用不需要走讀盤邏輯;
如果BloomFilter返回可能存在,那麼屬於誤判情況。 請求的元素在磁碟中,BloomFilter返回存在。
下面摘自維基:
如果想判斷一個元素是不是在一個集合裡,一般想到的是將集合中所有元素儲存起來,然後通過比較確定。鏈表,樹,雜湊表等等資料結構都是這種思路。但是隨著集合中元素的增加,我們需要的儲存空間越來越大。同時檢索速度也越來越慢。
布隆過濾器的原理是,當一個元素被加入集合時,通過K個散列函數將這個元素映射成一個位元組中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。
優點:
相比於其它的資料結構,布隆過濾器在空間和時間方面都有巨大的優勢。
缺點:
隨著存入的元素數量增加,誤算率隨之增加。但是如果元素數量太少,則使用散列表足矣。
另外,一般情況下不能從布隆過濾器中刪除元素。
Bloom Filter(布隆過濾器)