简介
布隆过滤器(Bloom Filter)是一种空间效率高、时间复杂度低的数据结 构,用于测试一个元素是否是一个集合的成员。其特点是允许一定概率的错误(假阳性),但绝不会错过实际存在的元素(假阴性)。
应用场景
布隆过滤器通常用于大规模数据处理中,如数据库、网络缓存等场景,特别是在空间和时间有限的情况下。
对于海量数据,判定某个数据是否存在且能容忍轻微误差的场景(如缓存穿透,海量数据去重)来说特别合适
什么是布隆过滤器
实际上是一个很长的二进制向量(位数组)和一系列随机映射函数(哈希函数)。
布隆过滤器会使用一个很大的bit数组来保存所有数据,数组中每个元素只占1bit,每个元素只能是0 or 1。这样申请一个保存一百万个元素的位数组也只需要的空间
这里的位数组可以用C++的 bitset来理解
如果使用一个哈希函数,那不就相当于哈希表吗。 你也可以理解布隆过滤器是一个表+多个哈希函数
工作原理
当插入元素时,使用多个哈希函数得到多个哈希值,然后将位数组中哈希值对应下标的元素置1。
查询的时候,通过多个哈希函数得到多个哈希值,如果这几个哈希值对应的位数组下标的元素都为1,那么就说明该元素在集合中。如果一个值不为1,则不存在。
根据哈希函数的性质,不同字符串哈希出来的哈希值可能相同,这个时候我们可以增加位数组大小或者调整哈希函数数量。
误判不一定是两个元素经过多个哈希后得到的哈希值完全一样,而是有可能a元素经过哈希后得到的哈希值集合是b,c,d经过哈希后得到的哈希值集合子集,因此如果哈希函数太多的话,误判概率也会增高
综上:布隆过滤器判断一个元素存在,会有小概率误判。但是布隆过滤器说一个元素不存在,那么该元素一定不存在。
优点:
- 空间效率高:相比传统的集合存储方式,布隆过滤器需要的空间要小很多,尤其适合存储大规模数据。
- 查询速度快:布隆过滤器的查询时间是常数时间(O(k),其中k是哈希函数的数量),非常高效。
- 无需存储元素:布隆过滤器只存储位数组,因此节省了存储空间。
缺点:
- 假阳性:布隆过滤器会有一定的误判率,即返回一个元素存在但实际上并不存在。这个错误是不可避免的,并且理论上集合插入的元素越多,误报概率越大。
- 删除操作:标准的布隆过滤器不支持删除操作,因为一个元素可能会影响多个哈希位置,无法确定哪些位置是由当前元素导致的。