布隆过滤器(Bloom Filter)
简要介绍:
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。
算法
- 首先需要k个hash函数,每个函数可以把key散列成为1个整数
- 初始化时,需要一个长度为n比特的数组,每个比特位初始化为0
- 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
- 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,如果所有的比特位都是1,认为在集合中。
优点
不需要存储key,节省空间
缺点
- 算法判断key在集合中时,有一定的概率key其实不在集合中
- 无法删除
计数布隆过滤器
简要介绍
标准Bloom filter对于需要精确检测结果的场景将不再适用,而带计数器的Bloom filter的出现解决了这个问题。Counting Bloom filter实际只是在标准Bloom filter的每一个位上都额外对应得增加了一个计数器,在插入元素时给对应的 k (k 为哈希函数个数)个 Counter 的值分别加 1,删除元素时给对应的 k 个 Counter 的值分别减 1。
优点
可以删除
缺点
无法合并,占用空间大
Quotient Filter
简要介绍
商过滤器是一种空间效率很高的概率数据结构。他是基于一个hash表,有三个fingerprint 比较重要,
is_occupied :1:
is_continuation: 1:被占用,不是第一个余数
is_shifted: 1:插槽中的余数不在其规范插槽中
插入实例
在状态1的时候插入三个元素,他们的余数分别为1,4,7,此时都是空的我们可以直接将其占用;在状态2的时候,c余数为1,但是1已经有了,所以c被放到2中,延续和移动要置1;插入d是2,也就是他的规范槽是2,但是被占了,所以要将2的置is_occupied 置1;d所在的位置是移位以后的。
在状态三的时候,是假设了ar<bR,所以其它人都得移动,
优点
- 可以合并
缺点
- 查询速度慢
MergeCBF
优点
- 可以合并
缺点
- 查询速度慢