未完待續.....數組
如今有一個空額布隆過濾器, 過濾器裏的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個元素的集合總共的數量爲:
要讓 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