轉載自:焦萌 2007年1月30日 數組
【http://blog.csdn.net/jiaomeng】數據結構
從前面幾篇對Bloom Filter的介紹能夠看出,標準的Bloom Filter是一種很簡單的數據結構,它只支持插入和查找兩種操做。在所要表達的集合是靜態集合的時候,標準Bloom Filter能夠很好地工做,可是若是要表達的集合常常變更,標準Bloom Filter的弊端就顯現出來了,由於它不支持刪除操做。ide
Counting Bloom Filter的出現解決了這個問題,它將標準Bloom Filter位數組的每一位擴展爲一個小的計數器(Counter),在插入元素時給對應的k(k爲哈希函數個數)個Counter的值分別加1,刪除元素時給對應的k個Counter的值分別減1。Counting Bloom Filter經過多佔用幾倍的存儲空間的代價,給Bloom Filter增長了刪除操做。下一個問題天然就是,到底要多佔用幾倍呢?函數
咱們先計算第i個Counter被增長j次的機率,其中n爲集合元素個數,k爲哈希函數個數,m爲Counter個數(對應着原來位數組的大小):spa
上面等式右端的表達式中,前一部分表示從nk次哈希中選擇j次,中間部分表示j次哈希都選中了第i個Counter,後一部分表示其它nk – j次哈希都沒有選中第i個Counter。所以,第i個Counter的值大於j的機率能夠限定爲:.net
上式第二步縮放中應用了估計階乘的斯特林公式:orm
在Bloom Filter概念和原理一文中,咱們提到過k的最優值爲(ln2)m/n,如今咱們限制k ≤ (ln2)m/n,就能夠獲得以下結論:blog
若是每一個Counter分配4位,那麼當Counter的值達到16時就會溢出。這個機率爲:get
這個值足夠小,所以對於大多數應用程序來講,4位就足夠了。it
關於Counting Bloom Filter最先的論文:Summary Cache: A Scalable Wide-Area Web Cache Sharing Protocol