天天看點

Bloom Filter 系列改進之Scalable Bloom Filter

Scalable Bloom Filter(SBF)的設計過程:

    1. 首先将一個簡單的BBF看成是SBF[0]={n0,m,k},其對應的錯誤率為f0.

    2. 計算滿足錯誤率小于f0的前提下,BBF能夠存儲多少個元素.

    3. 當資料增多時,新的SBF1被加到SBF中,其大小為m1=2*m.

    4. 當n>3*n0時,另一個新的SBF2被加入到SBF中,其大小為m2=4*m.

    5. 當SBF增加了i次,既n>(2^i-1)*n0時,一個新的SBFi被加到SBF後面,其大小為mi=(2^i)*m.

 定理1:經過i次拓展後,SBF能夠容納的元素個數為=(2^(i+1))*n0

 證明:根據誤判率f的計算公式

Bloom Filter 系列改進之Scalable Bloom Filter

    得到元素個數n的計算公式如下,同時根據第一次拓展後添加的SBF1={n1,m1,k},其中的m1=2*m,進而得到n1和n0之間的關系如下:

Bloom Filter 系列改進之Scalable Bloom Filter

    依次得到ni=(2^i)*n0,進而對n0到ni進行求和計算得到其總共的元素個數=(2^(i+1))*n0,下面給出應用DBF和BBF之間的性能對比:

Example1:在資料量持續增長的情況下對比DBF和SBF的表現:

    他們都是從BBF{n,m,k}演化而來,其中的m=16,k=2,同時給定f0=0.155,進而得到

Bloom Filter 系列改進之Scalable Bloom Filter

    由于n0必須是整數,我們設n0=4,現在假設a,b,c,d,e,f,g,h,i連續進入資料集中,DBF和SBF的處理方式分别如下,可以看到DBF和SBF都用了48位來表示這9個元素,但是SBF用了兩個數組,DBF用了三個數組,相比之下SBF由于用的數組少,是以它能夠表示更多的元素,同時它的錯誤率也更低(證明過程請參看原文)。

Bloom Filter 系列改進之Scalable Bloom Filter

SBF的元素插入過程

    1. 插入一個元素之前,進行如下的公式驗證,其中的c是SBF所容納的元素個數

Bloom Filter 系列改進之Scalable Bloom Filter

    2. 如果上述公式成立,那麼生成SBF[i+1],同時計算k個hash函數對SBF[i+1]進行置位,用c+1替換現有的c,用i+1替換現有的i.

    3. 如果公式不成立,那麼生成k個hash函數來對SBFi進行置位

定理2: 為了代表一個含有n個元素的資料集,SBF需要拓展i次,包含L個SBF數組,其中的最後一個SBFi代表t個元素,整個SBF占據了MSBF位,對應的誤判率為fSBF。

Bloom Filter 系列改進之Scalable Bloom Filter

證明:

   根據上面的推導可知,需要表示n個元素,它需要滿足如下的公式,其中的i為需要的SBF拓展次數

Bloom Filter 系列改進之Scalable Bloom Filter

    進而得到如果要表達n個元素,那麼需要拓展的次數i的表示如下:

Bloom Filter 系列改進之Scalable Bloom Filter

     容易看出,在經過i次拓展之後,SBF數組的大小變為L=i+1=[log2(n/n0+1)]+1,那麼SBF整體需要占用的位大小為:

Bloom Filter 系列改進之Scalable Bloom Filter

    需要注意的是,SBFj表示了(2^j)*n0個元素,這當然除了最後一個SBF表示的t個元素之外,t=n-n0(2^j-1),前j個SBF中的錯誤率f的求法如下:

Bloom Filter 系列改進之Scalable Bloom Filter

    最後的t個元素在最後一個SBF中表示,其錯誤率如下:

Bloom Filter 系列改進之Scalable Bloom Filter

    進而得到整體的SBF的錯誤率如下:

Bloom Filter 系列改進之Scalable Bloom Filter

    再根據上面推導出的i等公式,進而得到定理中fSBF的最終表達式。

SBF Element Query過程如下:

    1. 當我們對某個元素做一次查詢時

    2. 計算k個hash函數,判斷SBFj中的k個位置是否都為1

    3. 如果是,那麼在SBFj中能夠找到這個元素

    4. 如果不是,那麼SBFj中沒有這個元素的表示,此時必須檢查SBFj-1中是否有這個元素,j=j-1,然後再傳回到第2步,直到j=-1。

    很明顯,從SBF中查詢一個元素在最壞的情況下需要查找所有i+1個SBF,這樣一來就需要進行k(i+1)=k([log2(n/n0+1)]+1)次hash計算。

參考文獻:

原文:A Scalable Bloom Filter for Membership Queries Kun Xie, etc. IEEE GLOBECOM 2007

圖檔出處:http://www.docin.com/p-905966302.html



繼續閱讀