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ÿ