简单介绍布隆过滤器

本文介绍了布隆过滤器的基本概念及其工作原理,并通过一个具体的实例演示了如何使用布隆过滤器进行元素检索。文章指出布隆过滤器在空间效率和查询时间方面表现优秀,但在误识别率和删除操作上存在局限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一句话介绍

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
From 百度百科 

输入与输出

S:目标查找元素
Z: 被查找元素集(set)
Input: S,Z
Output:
True, S存在于Z
False, S不存在于Z

 

实际例子

但从文字上是很难理解的,下面举个实际的例子:

00000000000000000000

  0   1    2  3   4   5    6   7   8   9   10  11   12  13  14  15 16  17  18  19

1. 首先初始化一个size为20、初始值全为0的数组,和两个hash函数(hash函数的个数由自己定,为讲解方便这里使用两个):

hashA(x) 和 hashB(x)
函数自己定义就好,只要output能对应到数组的key就行。

另外还有一个被查找元素集:

{'wo','shi','sevens','chan'}

2. 把被查找元素集的每个元素都经过所有的hash函数:

'wo' -> hashA('wo') -> 3
'wo' -> hashB('wo') -> 8

把得到的hash值找到数组的key,然后将值改为1:

00010000100000000000

  0   1    2  3   4   5    6   7   8   9   10  11   12  13  14  15 16  17  18  19

同理把所有元素都处理一遍最后得到数组:

01110010100010110000

  0   1    2  3   4   5  6   7   8   9  10  11 12  13  14  15 16  17  18  19

3. 然后就开始查找我们的目标元素(假设我们要查找'sevens')是否在集合中,同理,先把目标元素进行一遍hash取值:

'sevens' -> hashA('sevens') -> 6
'sevens' -> hashB('sevens') -> 15

根据两个hash值可以看到,数组中6和15的位置都为1,所以元素可能存在集合中。反之如果有一个为0,都肯定不存在集合中。

可能存在

是的,布隆过滤器是存在一定的误差率的,特别是数据量大的时候,所以我们只能说元素可能存在集合中。在允许误差的场景下还是可以使用的。

转载于:https://my.oschina.net/u/203607/blog/1649101

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值