過濾器系列(一)—— Bloom filter

由於要作過濾器相關內容,最近讀了一些過濾器方面的文章,準備從中提取主要思想寫幾篇博客。算法

做爲這系列的第一篇文章,首先得講一下過濾器是幹什麼用的。從歷史發展來看,過濾器最先出現是做爲散列表的替代品,那麼功能就要和散列表差很少,主要是查詢當前的元素是否在我已知的集合裏。可是隨着數據量不斷增大,散列表相對來講佔用空間過大,而空間佔用小的查找樹的\(O(logn)\)時間複雜度又過高。因而有人想出來可否用正確率作代價,換取較高的查詢速度和較小的存儲佔用,這就是過濾器。固然,這裏所容許的錯誤僅限假陽性,例如咱們作一個關於代理ip地址的過濾器,當有一個不是代理的ip地址發來,咱們也許會把它錯認成是代理ip,可是咱們不會容許一個代理ip被錯認成非代理ip,簡單的說,就是寧肯錯殺,不可放過。數組

做爲第一篇,按照歷史角度,先說布隆過濾器(bloom filter)。原版的布隆過濾器很樸素,只支持插入和查詢兩個操做,下面咱們看它的原理。數據結構

首先,布隆過濾器申請了一片空間,存了一個數組,每一個元素都只有1個bit,共有N個元素,初始化每一個值都爲0。以下圖所示。(實際並無index這一行,僅僅是爲了方便觀看)
image1函數

插入操做

下一步就是如何插入數據。布隆過濾器要求你事先定義K個Hash函數,這K個Hash函數都是從定義域映射到上圖中的index空間(即N)。經過這K個Hash函數,咱們對一條新的數據x,計算出\(h_0(x),h_1(x),....h_{k-1}(x)\),這樣就獲得了K個地址。咱們將這K個地址的比特位置1.這裏就有值得注意的地方,由於咱們的過濾器的大小遠遠小於數據集大小,那麼經常會有Hash以後映射到同一個位置的數據,不要擔憂,照常置1。spa

下面的例子是K=3,\(h_0(x)=2,h_1(x)=5,h_2(x)=7\)。如圖所示
image2代理

查找操做

當插入其餘一些數據後,過濾器可能變成下圖所示,咱們不關心中間經歷了什麼。blog

image3
咱們如今查找剛纔第一次插入的數據是否在過濾器中,那麼一樣計算\(h_0(x),h_1(x),h_2(x)\),算出3個地址,2,5,7,去表中查找,若3個地址的數據都爲1,則判斷在過濾器中,不然判斷不在過濾器中。ip

算法和數據結構都很簡單,咱們下面說的是對布隆過濾器的一些分析和題外話,有興趣的讀者能夠繼續閱讀。博客

咱們在過濾器上很關注三個指標,一個是操做的時間複雜度,一個是平均每條數據佔用的比特數,最後是錯誤率。下面咱們分析一下。it

時間複雜度

布隆過濾器上的兩個操做,插入和查詢,都只是計算一下K個Hash函數的值,而後進行K次訪存操做。那麼時間上很明顯是\(O(K)\),其實不算也知道,一個替代Hash表的過濾器,操做代價必須是常數級別。

平均每條數據佔用的比特數 and 錯誤率

直覺上,很容易得出這兩個衡量指標實際上是矛盾的,當想要較低錯誤率時就要增大空間;想要減少佔用空間時,那麼因爲Hash碰撞的次數變多,錯誤率也會提升。咱們在這裏將錯誤率做爲已知來計算平均每條數據佔用的比特數。爲何這麼作?由於在實際應用中咱們能夠對過濾器設定一個錯誤率做爲標準,一般狀況下咱們對這一點要求更嚴格。

咱們設數組總大小爲\(N\),插入n條數據後表中還爲0的數據佔所有的比例爲\(\phi\)。那麼

\(\phi = (1-K / N)^n\)-------------------------(1)
讀者能夠想一想爲何不是\(K * n / N\),在這裏,咱們其實省略了Hash函數默認是隨機分佈到全空間的。

設錯誤率爲\(P\)

\(P = (1-\phi)^K\) ----------------------------(2)
錯誤只發生隨機分佈到K個地址,結果在K個地址都有數據用了,那麼無論你是否在過濾器中,布隆過濾器都會判斷你在其中,這就是錯誤來源。

而後咱們對(1)式兩邊取對數

\(log_2^\phi = log_2^{(1-K/N)^n}\)
使用換底公式
\(log_2^\phi = log_2^{(1-K/N)^n} = log_e^{(1-d/N)^n} * log_2^e = -n * K / N *log_2^e\) ---(3)

咱們要求的平均每條數據佔用的比特數\(N(bit) / n = log_2^{1/P} * log_2^e / (log_2^\phi * log_2^{(1-\phi)})\),經過極值點計算能夠獲得分母最大時,\(\phi=0.5\),分母爲1,則結果爲\(N/n = log_2^{1/P} / ln2\)

能夠看到,每條數據佔用的比特數與錯誤率的對數成反比。

以後我會先把幾個不一樣思想的過濾器介紹一遍,最後會有關於布隆過濾器的一些變形

相關文章
相關標籤/搜索