布隆过滤器
布隆过滤器实际上是一个很长的二进制向量和一系列映射函数,布隆过滤器可以用于检索一个元素是否在一 个集合中。
优点:是空间效率和查询时间都比一般的算法要好的多
缺点:是有 一定的误识别率和删除困难。
由于是随着集合 中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢,不过世界 上还有一种叫作
散列表(又叫哈希表,Hash table)的数据结构。它可以通过一 个 Hash 函数将一个元素映射成一个位阵列中的
一个点。这样一来,我们只要看 看这个点是不是 1 就可以知道集合中有没有它了。这就是布隆过滤器的基本思想
算法:
-
首先需要 k 个 hash 函数,每个函数可以把 key 散列成为 1 个整数
-
初始化时,需要一个长度为 n 比特的数组,每个比特位初始化为 0
-
某个 key 加入集合时,用 k 个 hash 函数计算出 k 个散列值,并把数组中对 应的比特位置为 1
-
判断某个 key 是否在集合时,用 k 个 hash 函数计算出 k 个散列值,并查询 数组中对应的比特位,如果所有的比特位都是 1,认为在集合中。
布隆过滤器数据结构
BloomFilter 是由一个固定大小的二进制向量或者位图(bitmap)和一系列映射函数组成的。
在初始状态时,对于长度为 m 的位数组,它的所有位都被置为 0,如下图所示:
当有变量被加入集合时,通过 K 个哈希函数将这个变量映射成位图中的 K 个点,把 它们置为 1(假定有两个变量都通过 3 个映射函数)
查询某个变量的时候我们只要看看这些点是不是都是 1 就可以大概率知道集合 中有没有它了.
如果这些点有任何一个 0,则被查询变量一定不在;
如果都是 1,则被查询变量很可能存在(是因为映射函数本身就是散列函 数,散列函数是会有碰撞的。 )
优点:不需要存储 key,节省空间
缺点:
- 算法判断 key 在集合中时,有一定的概率 key 其实不在集合中
- 无法删除