布隆过滤器

布隆过滤器是一种高效的空间节省型数据结构,用于判断一个元素可能是否存在于集合中。它利用多个哈希函数将元素映射到位数组,允许快速插入和查询,但存在假阳性的可能性。常见应用场景包括URL去重、垃圾邮件过滤和黑名单管理。针对不支持删除的问题,有CountingBloomFilter等优化方案。

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

1、什么是布隆过滤器:

        布隆过滤器是一种数据结构,特点是高效的插入和查询,而且非常节省空间。通过对位(bit)的操作,可以用来告诉你”某个值一定不存在或者可能存在“。相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是 hash 碰撞造成的误判。

2、算法实现步骤:

(1)选取k个哈希函数,记为 {h1,h2,…,hk},至于参数k的选择问题,我后面再说。


(2)假设现在有n个元素需要被映射到bit数组中,bit数组的长度是m。初始时,将m位的bit数组的每个位置的元素都置为0。一样地,关于参数m的选择我之后说。


(3)现在,把这个n个元素依次用第1步选取的k个哈希函数映射到bit数组的位置上,bit数组被映射到的位置的元素变为1。显然,一个元素能被映射到k个位置上。过程如图所示,现在把元素集合{x,y,z}通过3个哈希函数映射到一个二进制数组中。


(4)最后,需要检查一个元素是否在已有的集合中时,同样用这k个哈希函数把要判断的元素映射到bit数组的位置上,只要bit数组被映射到的位中有一个位不是1,那一定说明了这个元素不在已有的集合内。如图所示,检查w是否在集合中时,有一个哈希函数将ww映射到了bit数组的元素为0的位置。
 

图 例:

 

3、布隆过滤器优缺点

(1)优点:

节省空间:不需要存储数据本身,只需要存储数据对应hash比特位
时间复杂度低:插入和查找的时间复杂度都为O(k),k为哈希函数的个数
(2)缺点:

存在假阳性:布隆过滤器判断存在,但可能出现元素实际上不在集合中的情况;误判率取决于哈希函数的个数,对于哈希函数的个数选择,我们第4部分会讲
不支持删除元素:如果一个元素被删除,但是却不能从布隆过滤器中删除,这也是存在假阳性的原因之一。

4、参数的选择:

假设E表示错误率,n表示要插入的元素个数,m表示bit数组的长度,k表示hash函数的个数。

(1)当hash函数个数 k = (ln2) * (m/n)时,错误率E最小(此时bit数组中有一半的值为0)

(2)在错误率不大于E的情况下,bit数组的长度m需要满足的条件为:m ≥ n * lg(1/E)。

(3)结合上面两个公式,在hash函数个数k取到最优时,要求错误率不大于E,这时我们对bit数组长度m的要求是:m>=nlg(1/E) * lg(e) ,也就是 m ≥ 1.44n*lg(1/E)(lg表示以2为底的对数)
 

5、布隆过滤器的应用场景:

(1)爬虫系统url去重


(2)垃圾邮件过滤


(3)黑名单

问题实例:

给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件共同的URL。如果是三个乃至n个文件呢? 

如果允许找过的URL有一定的错误率,那么我们可以使用布隆过滤器来实现。根据这个问题我们来计算下内存占用,4G = 2^32大概是40亿*8大概是340亿的bit数组,n=50亿,如果按出错率0.01算需要的大概是650亿个bit。 现在可用的是340亿,相差并不多,这样可能会使出错率上升些。另外如果这些urlip是一一对应的,就可以转换成ip,则大大简单了。 

具体做法就是:将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的url
 

6、如何解决布隆过滤器不支持删除的问题:

(1)counting bloom filter:

Counting Bloom Filter将标准 Bloom Filter位数组的每一位扩展为一个小的计数器(counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter的值分别减1。Counting Bloom Filter通过多占用几倍的存储空间的代价,给Bloom Filter增加了删除操作。
 

图 例:

 

(2)布谷鸟过滤器:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值