布隆过滤器之Counting Bloom Filter

本文深入讲解BloomFilter的原理和应用,包括其结构、如何判断元素存在性、CBF等变体,以及在网页爬虫URL去重、反垃圾邮件等场景的应用。

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

Bloom Filter是一种空间效率很高的概率型数据结构,由位数组和一组哈希函数组成。特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。总体规则是:位数组中存放的是:集合中每个元素的哈希转二进制后对应的值,对于新加入的元素根据其哈希值去判断是否已经存在于集合中。

结构

Bloom Filter使用位数组来实现过滤,初始状态下位数组每一位都为0,如下图所示:

img

假如此时有一个集合S = {x1, x2, … xn},Bloom Filter使用k个独立的hash函数,分别将集合中的每一个元素映射到{1,…,m}的范围。对于任何一个元素,被映射到的数字作为对应的位数组的索引,该位会被置为1。比如元素x1被hash函数映射到数字8,那么位数组的第8位就会被置为1。下图中集合S只有两个元素x和y,分别被3个hash函数进行映射,映射到的位置分别为(0,3,6)和(4,7,10),对应的位会被置为1:

529239.png

现在假如要判断另一个元素是否是在此集合中,只需要被这3个hash函数进行映射,查看对应的位置是否有0存在,如果有的话,表示此元素肯定不存在于这个集合,否则有可能存在。下图所示就表示z肯定不在集合{x,y}中:

img

对有可能存在的解释

假设X进行三次hash后对应的bit位是(0,3,6),Y被三次hash后对应的bit位是(0,3,7),则Y在bit的0和3的值会覆盖掉X的值,假设还有一个新元素Z的hash结果是(1,3,6),则意味着X的hash结果被全部覆盖,也就是说即使没有X,(0,3,6)位置的值也是1,所以只能是有可能存在。

CBF

由于判断某个元素在bloom filter是否存在时个概率问题,所以就不能随便删除一个元素了,如上如果我们删除了X元素的哈希结果,那么Y元素和Z元素也会被误判为不存在集合中。

删除元素问题可以通过布隆过滤器的变体CBF(Counting bloomfilter)解决。CBF将基本Bloom Filter每一个Bit改为一个计数器,这样就可以实现删除字符串的功能了。

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

其他bloomfilter的升级版:

  • SBF(Spectral Bloom Filter):在判断元素是否存在的基础上还可以查询集合元素的出现频率。

  • dlCBF(d-Left Counting Bloom Filter):利用 d-left hashing 的方法存储 fingerprint,解决哈希表的负载平衡问题;

  • ACBF(Accurate Counting Bloom Filter):通过 offset indexing 的方式将 Counter 数组划分成多个层级

应用场景

  1. 网页爬虫对URL的去重,避免爬取相同的URL地址;
  2. 反垃圾邮件,从数十亿个垃圾邮件列表中判断某邮箱是否垃圾邮箱(同理,垃圾短信);
  3. 缓存击穿,将已存在的缓存放到布隆中,当黑客访问不存在的缓存时迅速返回避免缓存及DB挂掉。
  4. spark的jion操作中Runtime Filter的过滤原理实现。

数学结论

http://blog.youkuaiyun.com/jiaomeng/article/details/1495500该文中从数学的角度阐述了布隆过滤器的原理,以及一系列的数学结论。

首先,与布隆过滤器准确率有关的参数有:

  • 哈希函数的个数k;
  • 布隆过滤器位数组的容量m;
  • 布隆过滤器插入的数据数量n;

主要的数学结论有:

  1. 为了获得最优的准确率,当k = ln2 * (m/n)时,布隆过滤器获得最优的准确性;
  2. 在哈希函数的个数取到最优时,要让错误率不超过є,m至少需要取到最小值的1.44倍;

参考

https://zhuanlan.zhihu.com/p/43263751

https://blog.youkuaiyun.com/tianyaleixiaowu/article/details/74721877

转载于:https://my.oschina.net/freelili/blog/3001045

布隆过滤器Bloom Filter)是一种重要的数据结构,它用于快速判断一个元素是否存在于一个集合中。布隆过滤器的核心思想是通过一系列哈希函数来对元素进行多次哈希,然后将得到的哈希值映射到一个位数组中,并将对应的位置设为1。当需要判断一个元素是否存在时,同样对其进行多次哈希,检查对应位数组的值是否都为1,若都为1则可以确定元素可能存在;若存在一个0,则可以确定元素一定不存在。因此,布隆过滤器是一种基于概率的数据结构,可以高效地进行查找。 然而,布隆过滤器也存在一些问题。首先,由于多个不同的元素可能会哈希到相同的位上,因此在查询时可能出现误判,即判断一个元素存在时实际上并不存在。这种误判是由于多个元素共享了某一位的原因导致的。其次,布隆过滤器的特性决定了它无法支持元素的删除操作,因为删除一个元素可能会影响其他元素的判断结果,从而增加误判率。 要注意的是,计数布隆过滤器Counting Bloom Filter)提供了一种实现删除操作的可能性,但并不能保证在后续查询时该值一定返回不存在。因此,不能说计数布隆过滤器支持删除,而是说计数布隆过滤器提供了实现删除的可能。 [3<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【海量数据处理】布隆过滤器BloomFilter](https://blog.youkuaiyun.com/qq_43727529/article/details/127180864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java --- redis7之布隆过滤器BloomFilter](https://blog.youkuaiyun.com/qq_46093575/article/details/130613434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值