理解BloomFilter

理解BloomFilter

一. 產生背景

很多時候,我們都有這樣一個需求:判斷一個元素是否存在於集合中。比如IDEA中的單詞拼寫檢查,要判斷一個用戶輸入的單詞是否在詞庫中。

我們輕易能想到的一個簡單的解決方案,就是使用一個Hash表,將所有合法的單詞都保存在Hash表中,這樣寫入和查詢的時間複雜度都爲O(1),還是很快的。但是這樣做有一個問題,就是太耗費空間。而且由於Hash表的散列衝突問題,就更加劇了空間的佔用。這時就可以應用Bloom Filter。

二. BloomFilter原理

Bloom Filter有兩個要素:

  1. 一個很長的二進制向量
  2. 一系列隨機映射函數(hash函數)

布隆過濾器的原理是:當一個元素被加入集合時,通過K個hash函數將這個元素映射成一個位數組中的K個點,並把這K個點置爲1。檢索時,我們只要看看這些點是不是都是1就(大約)知道集合中有沒有它了:如果這些點有任何一個0,則被檢元素一定不在;如果都是1,則被檢元素很可能在。這就是布隆過濾器的基本思想。

可以注意到,上面用了大約、很可能這些修飾詞,也就是說,BloomFilter是有一定誤判率的:

  1. 如果一個元素被判斷爲不存在,則一定不存在。
  2. 如果一個元素實際不存在,但是其映射到的K個位置都是1,則會將其誤判爲存在。

三. BloomFilter使用場景

  1. 垃圾郵件過濾
  2. 白名單
  3. 解決緩存穿透
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章