介绍
就是一个集合,检测元素是不是存在于集合中。速度超快,但是有一定的误识别率,同时删除困难
Bloom Filter算法
添加元素
- 一个m位的数组,数组都是0
- 新来一个输入,通过k个hash函数得到数组的k个索引
- 将k个索引都置为1
检查元素
将被检查元素通过k个hash函数得到数组的k个索引,如果k个位置都是1则被检查元素在集合之中(有误报几率)
误报率
给定一个hash函数,一个特定位没有被设置为1的概率
1−1m
对于所有的k个HASH函数,都没有把这个位设置为1的概率是
(1−1m)k
如果我们已经插入了n个元素,那么对于一个给定的位,这个位仍然是0的概率是
(1−1m)kn
那么,这个位是1
1−(1−1m)kn
如果一个特定元素误报,就是索引全是1
[1−(1−1m)kn]k
⎡⎣1−(1+1−m)(−m)kn−m⎤⎦k≈(1−e−knm)k
宁可错报,不可漏报
通过一定的错误率换取算法的时间和空间
Counting Bloom Filter
支持删除操作的Bloom Filter
把数组的的0,1换成一个个计数器,就可以支持删除操作
进阶
- 最优的哈希函数个数:
k=(ln2)∗(mn)m为数组大小,n为输入元素个数。
- 位数组的大小:在错误率不大于E的情况下,m至少要等于
n∗lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为 0,则m>=nlg(1/E)∗lge大概就是 nlg(1/E) 1.44倍(lg表示以2为底的对数)。