參照 : http://billmill.org/bloomfilter-tutorial/函數
布隆過濾器是一個用來判斷某元素是否在全集中的工具.工具
實際上它是一個有 m 個槽的位圖, 他擁有 k 個 hash 函數, 每一個元素進來的時候會經過 k 個 hash 函數映射到任意 k 個槽中, 並將槽置爲 1.get
當須要判斷某元素是否在過濾器中, 則經過 k 個 hash 函數 hash 事後看對應的槽是否爲 1, 若是是, 則可能存在 (由於這些 1 多是別的元素填充的), 若是有任意一個槽不爲 1, 則一定不在過濾器中.hash
因爲有 k 個 hash 函數, 因此布隆過濾器的插入和查詢複雜度都爲 O(k), 而空間複雜度則難以計算, 一個是依賴你設置的 m 的大小, 另一個是要看輸入元素在 hash 後在過濾器中的稀疏程度table
過大的 k 會致使時間複雜度上升, 而太小的 k 則會致使誤判率上升, 例如 k = 1, 則退化成了只有一個 hash 函數的 hash table.方法
它的優點在於不須要想 hashSet 或者 hashTable 那樣存儲實際的元素, 從而節省了空間, 同時又在你能夠接受的誤判範圍內判斷出元素是否在集合中. 查詢
布隆過濾器的誤判率是能夠計算的, 假設元素的全集個數爲 n, 過濾器槽爲 m, 共有 k 個函數, 那麼誤判率爲 (1-e-kn/m)ktutorial
而最優的 k 值也是能夠計算的, 公式爲 (m/n)ln(2), 因此, 咱們能夠根據以下步驟來斷定布隆過濾器的初始化大小 mfilter
1. 決定你的元素輸入個數 n 的大概值tab
2. 爲 m 選一個值
3. 經過公式計算 k 的值
4. 經過公式計算 誤判率, 假如不滿意, 則回到 2. 從新選擇 m 值, 直到得出滿意的誤判率