布隆過濾器出現的背景:
如果想判斷一個元素是不是在一個集合里,一般想到的是將集合中所有元素保存起來,然后通過比較確定。鏈表、樹、散列表(又叫哈希表,Hash table)等等數據結構都是這種思路,存儲位置要么是磁盤,要么是內存。很多時候要么是以時間換空間,要么是以空間換時間。
在響應時間要求比較嚴格的情況下,如果我們存在內里,那么隨着集合中元素的增加,我們需要的存儲空間越來越大,以及檢索的時間越來越長,導致內存開銷太大、時間效率變低。
布隆過濾器的特點:
此時需要考慮解決的問題就是,在數據量比較大的情況下,既滿足時間要求,又滿足空間的要求。即我們需要一個時間和空間消耗都比較小的數據結構和算法。Bloom Filter就是一種解決方案。
布隆過濾器(英語:Bloom Filter)是1970年由布隆提出的。它實際上是一個很長的二進制向量和一系列隨機映射函數。布隆過濾器可以用於檢索一個元素是否在一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,缺點是有一定的誤識別率和刪除困難。
布隆過濾器的原理是,當一個元素被加入集合時,通過K個散列函數將這個元素映射成一個位數組中的K個點,把它們置為1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。
Bloom Filter的缺點
bloom filter之所以能做到在時間和空間上的效率比較高,是因為犧牲了判斷的准確率、刪除的便利性
- 存在誤判,可能要查到的元素並沒有在容器中,但是hash之后得到的k個位置上值都是1。如果bloom filter中存儲的是黑名單,那么可以通過建立一個白名單來存儲可能會誤判的元素。
- 刪除困難。一個放入容器的元素映射到bit數組的k個位置上是1,刪除的時候不能簡單的直接置為0,可能會影響其他元素的判斷。可以采用Counting Bloom Filter
參考:https://www.cnblogs.com/z941030/p/9218356.html
// 初始化 注意 構造方法的參數大小10 決定了布隆過濾器BitMap的大小 BitMapBloomFilter filter = new BitMapBloomFilter(10); filter.add("123"); filter.add("abc"); filter.add("ddd"); // 查找 filter.contains("abc")