BloomFilter原理简介
将数值m用k个不同的hash函数散列到k个位,这个k个位数值置位1就表示数值m。
很明显,就是将数字转换成多个bit位存储的数据结构。当有数字集合的时候,可以减少数字在内存中空间占用(一堆数值转换为了一个大bit数组)。如果需要判断一个数字是否包含在一个集合中,只需要运算k个hash函数看对应的位是否为1。
简单来说就是将一组数值转换为一个bit数组,根据一个数值的多个hash值对应的位是否为1判断它是否在这个集合中。
应用场景
BloomFilter常用于判断某个值是否在一个集合当中
优点
- 空间消耗和时间消耗比较小,多个hash函数并无关联,可以并行加速
- 时间效率为O(n/k)
缺点
- 只能粗略判断得到结论可能存在,因为hash有可能存在冲突
- 已经加入的元素无法删除。还是由于hash的冲突性,m散列到的值可能和n散列的值相同,如果把m对应散列的位删了那n可就查不到了。
应用策略
将数据集合初始化到bit数组的时候,设定的数组大小和hash函数的个数会对判断结果有很大的影响。这里照搬一下外链的结论,后续使用可参考。
假设BloomFilter中元素总bit数量为m,插入的元素个数为n,hash函数的个数为k,false positive probability(误判率)记做p,它们之间有如下关系(具体推导过程请参考维基百科):
1. 如果需要最小化false positive probability,则k的取值如下
k = m * ln2 / n; 公式一
2. 而p的取值,和m,n又有如下关系
m = - n * lnp / (ln2) ^ 2 公式二
3.把公式一代入公式二,得出给定n和p,k的取值应该为
k = -lnp / ln2
最后,也同样可以计算出m。
参考
https://zh.wikipedia.org/zh-hans/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8
http://oserror.com/backend/bloomfilter/