布隆過濾器(Bloom Filter) 未完待續

布隆過濾器雛形

 未完待續.....數組

計算錯誤率

如今有一個空額布隆過濾器, 過濾器裏的bit array的大小是m. 咱來插入一個元素. 此次插入過程當中的第一個hash函數會算出一個位置, 而後把這個位置設置爲1. 此時若是在這個過濾器中隨機選取一個位置, 這個位置的值是1的機率爲:函數

    (式①)spa

 

這個位置的值是0的機率爲:.net

    (式②)3d

 

插入這個元素須要進行k個hash運算, 而後把相應的位置的值都改成1. 這個元素插入完以後, 從這個過濾器中, 隨機取一個位置, 這個位置的值是0的機率爲:xml

   (式③)blog

 

這個位置的值是1的機率爲:數學

   (式④)hash

 

若是在這個布隆過濾器中, 插入了n個元素. 而後隨機取其中一個位置, 這個位置的值是0的機率爲:it

    (式⑤)

 

這個位置的值是1的機率爲:

    (式⑥)

 

如今這個布隆過濾器裏有n個元素. 如今來了一個新元素. 這個新元素用k個hash函數, 分別計算了hash值, 結果k個位置在以前就已經被設置爲了1. 這就是錯誤了, 把不存在於集合中的元素, 判斷爲了在集合中, 被稱爲假陽性. 這種狀況的機率是:

    (式⑦)

上面式子整理一下指數nk, 就等價於下面這個式子:

    (式⑧) 

 

這是一個極限公式:

上面的式⑧能夠根據這個極限公式, 轉化爲下面這個式子: 

    (式⑨)

函數 f 就是誤判率了.

最優的哈希函數個數

 

根據上面這個公式, 能夠將 f 轉化爲: 

  (式⑩)

 

式10的表達式太長了...我們引入兩個新的符號p 和 g :

 

我們回到話題"最優的hash函數個數k".

k是自變量, f是因變量. 讓 f 取值最小的那個k值, 就是最有解. 也就是最優的hash函數個數.

讓f最小, 也能夠轉化爲: 讓g最小. 因此我們求一下"令g值最小的k值"

 

 (式⑪)

 把上面這個k帶入到g中, 能夠獲得:

 

 想讓g取最小值, 其實就是讓 ln(p) * ln(1-p)  取最大值.

當p = 1/2 時 . ln(p) * ln(1-p) 取最大值. 也就是 g 取最小值. 也就是 f 取 最小值.

將 p = 1/2 帶入式11, 得:  

位數組的大小

 我們模擬一個場景: 使用布隆過濾器來作URL的過濾. 將含有不良信息的URL做爲黑名單, 存入到布隆過濾器中, 進行過濾.

咱麼假設全世界有u個URL. 其中有n個是含有不良信息的. 布隆過濾器的 `位數組` 的大小是m.

我們把這n個黑名單URL插入到布隆過濾器中.

這n個URL, 在被訪問時, 會直接被布隆過濾器斷定爲含有不良信息的URL.

可是若是布隆過濾器的誤判率是ϵ的話, 那麼會有 ϵ*(u - n) 個元素, 明明是正常的URL, 卻會被布隆過濾器認定爲是含有不良信息的URL.

 

在這個場景中, 布隆過濾器的做用就是判斷URL, 判斷並過濾掉有不良信息的URL. 他會正確地判斷出n個黑名單URL, 還會誤判ϵ*(u - n) 個URL. 

因此這個布隆過濾器, 會過濾 n + ϵ*(u - n) 個URL. 而當前的布隆過濾器中, 實際只有n個元素.

因此當前的布隆過濾器的`位數組`的狀態, 能夠表示的集合數量爲:

 (式⑫)

 

式⑫只是在剛纔的那個特定條件下的`位數組`能夠表示的集合數量. 

若是我們改變布隆過濾器的其中一個位. 那麼此時就表示了新的ω個集合.

剛剛講了, 只要改動其中一個位, 新的`位數組`就能夠表示新的ω個集合. m 位的`位數組`共有 2m 個不一樣的組合來進行改變. 進而能夠推出, m位的`位數組`能夠表示的集合數量爲:

 

 

全集中 n個元素的集合總共的數量爲:

 

要讓 位的位數組可以表示全部 個元素的集合, 必須有:

 

整理一下, 也就是:  

 

若是n 遠小於 ε·u 

 (式⑬)

 

接下來我們對於上式中的真數進行計算: 

 

因此, 式⑬中的: 

因而咱們得出結論1 : 在錯誤率不大於 ϵ 的狀況下, m 至少要等於 才能表示任意 n 個元素的集合. 

 

在計算錯誤率的小節中, 最後得出了式⑨: 

 

在計算最優函數個數的小節中, 定義了:

並且在最後p = 1/2 時, 爲最優函數個數. 

又根據上面小節的式⑪:

在取最優函數個數的時候:

 

我們令 f ≤ ε 

其中 

因而咱們有了結論2:  若是想採用最優函數個數, 那麼m值就得是結論1的 1.44倍.

 

總結一下結論1 和 結論2 :

若是想保證錯誤率不大於ε. 那麼就m的最小值就得是

若是hash函數的個數想取最優值, 那麼m的最小值就得是 

 

 

 

 

 

 

 (式①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯)

[1].<<數學之美>>第23章. 做者: 吳軍

[2].https://blog.csdn.net/maoke2005191/article/details/78977277

相關文章
相關標籤/搜索