参照 : http://billmill.org/bloomfilter-tutorial/
简介
布隆过滤器是一个用来判断某元素是否在全集中的工具.
实际上它是一个有 m 个槽的位图, 他拥有 k 个 hash 函数, 每个元素进来的时候会通过 k 个 hash 函数映射到任意 k 个槽中, 并将槽置为 1.
当需要判断某元素是否在过滤器中, 则通过 k 个 hash 函数 hash 过后看对应的槽是否为 1, 如果是, 则可能存在 (因为这些 1 可能是别的元素填充的), 如果有任意一个槽不为 1, 则必定不在过滤器中.
复杂度
由于有 k 个 hash 函数, 所以布隆过滤器的插入和查询复杂度都为 O(k), 而空间复杂度则难以计算, 一个是依赖你设置的 m 的大小, 另外一个是要看输入元素在 hash 后在过滤器中的稀疏程度
过大的 k 会导致时间复杂度上升, 而过小的 k 则会导致误判率上升, 例如 k = 1, 则退化成了只有一个 hash 函数的 hash table.
优点
它的优势在于不需要想 hashSet 或者 hashTable 那样存储实际的元素, 从而节省了空间, 同时又在你可以接受的误判范围内判断出元素是否在集合中.
计算方法
布隆过滤器的误判率是可以计算的, 假设元素的全集个数为 n, 过滤器槽为 m, 共有 k 个函数, 那么误判率为 (1-e-kn/m)k
而最优的 k 值也是可以计算的, 公式为 (m/n)ln(2), 所以, 我们可以根据如下步骤来判定布隆过滤器的初始化大小 m
1. 决定你的元素输入个数 n 的大概值
2. 为 m 选一个值
3. 通过公式计算 k 的值
4. 通过公式计算 误判率, 假如不满意, 则回到 2. 重新选择 m 值, 直到得出满意的误判率