bloom filter

Bloom filter 是由 Howard Bloom 在 1970 年提出的二進制向量數據結構,它具備很好的空間和時間效率,被用來檢測一個元素是否是集合中的一個成員。

結    構
二進制
召回率
100%
方    法
哈希函數

簡介

編輯
Bloom filter 是由 Howard Bloom 在 1970 年提出的二進制向量數據結構,它具備很好的空間和時間效率,被用來檢測一個元素是否是集合中的一個成員。若是檢測結果爲是,該元素不必定在集合中;但若是檢測結果爲否,該元素必定不在集合中。所以Bloom filter具備100%的召回率。這樣每一個檢測請求返回有「在集合內(可能錯誤)」和「不在集合內(絕對不在集合內)」兩種狀況,可見 Bloom filter 是犧牲了正確率和時間以節省空間。

計算方法

編輯
如須要判斷一個元素是否是在一個集合中,咱們一般作法是把全部元素保存下來,而後經過比較知道它是否是在集合內,鏈表、樹都是基於這種思路,當集合內元素個數的變大,咱們須要的空間和時間都線性變大,檢索速度也愈來愈慢。 Bloom filter 採用的是 哈希函數的方法,將一個元素映射到一個 m 長度的陣列上的一個點,當這個點是 1 時,那麼這個元素在集合內,反之則不在集合內。這個方法的缺點就是當檢測的元素不少的時候可能有衝突,解決方法就是使用 k 個哈希 函數對應 k 個點,若是全部點都是 1 的話,那麼元素在集合內,若是有 0 的話,元素則不在集合內。

優勢缺點

編輯
Bloom filter 優勢就是它的插入和查詢時間都是常數,另外它查詢元素卻不保存元素自己,具備良好的安全性。它的缺點也是顯而易見的,當插入的元素越多,錯判「在集合內」的機率就越大了,另外 Bloom filter 也不能刪除一個元素,由於多個元素哈希的結果可能在 Bloom filter 結構中佔用的是同一個位,若是刪除了一個比特位,可能會影響多個元素的檢測。

簡單例子

編輯
下面是一個簡單的 Bloom filter 結構,開始時集合內沒有元素
當來了一個元素 a,進行判斷,這裏哈希函數有兩個,計算出對應的比特位上爲 0 ,便是 a 不在集合內,將 a 添加進去:
以後的元素,要判斷是否是在集合內,也是同 a 同樣的方法,只有對元素哈希後對應位置上都是 1 才認爲這個元素在集合內(雖然這樣可能會誤判):
隨着元素的插入,Bloom filter 中修改的值變多,出現誤判的概率也隨之變大,當新來一個元素時,知足其在集合內的條件,即全部對應位都是 1 ,這樣就可能有兩種狀況,一是這個元素就在集合內,沒有發生誤判;還有一種狀況就是發生誤判,出現了哈希碰撞,這個元素本不在集合內。
相關文章
相關標籤/搜索