首页 > 其他分享 >布隆过滤器原理-原论文解析

布隆过滤器原理-原论文解析

时间:2024-04-20 09:02:53浏览次数:19  
标签:误差 code 元素 布隆 集合 哈希 过滤器 解析

布隆过滤器是由 BURTON H. BLOOM 在 1970 年提出的一种哈希方法,用于判断一个元素是否存在于某个集合中。HashSet 或其他的数据结构都使用了传统的哈希方法,得到的结果是准确的,而布隆过滤器得到的结果不一定准确,因为它使用了一种近似的哈希算法。

那为什么还要使用它呢?因为数据量变大时,假如达到了 1 亿,传统的哈希方法效率将变低,布隆过滤器的性能却仍然很好。以下是论文的部分介绍,有兴趣的可以看下原论文。

传统哈希方法

先来回顾下传统的不允许错误的传统哈希方法。假设我们存储 n 条消息,每条消息有 b 位长。首先,我们将哈希区域分成 h 个单元,每个单元有 b + 1 位,h > n。多出来的 1 位用来标志该单元是否为空。所以每条消息是 b + 1 位,第一位始终为 1。存储过程如下:

生成一个哈希地址 k,0 <= k <= h - 1,这个哈希地址是一个伪随机数,检查第 k 个单元是否为空,如果为空,则将数据存储在第 k 个单元;否则再次生成一个哈希地址,直到该地址下的单元为空,然后把数据存储在这个单元里。

判断一个消息是否在集合中的原理类似,仍然继续生成哈希地址,直到满足以下条件之一:

  1. 找到一个单元,其中存储了与当前消息相同的数据,这种情况下,该消息数据该集合
  2. 找到一个空的单元,意味着该消息不属于该集合

允许错误的两个方法

方法 1

方法 1 是从传统的无误差方法中自然推导出来的,思路是集合中并不直接保存元素本身,而是将元素编码为 code 后保存,code 比元素本身小,从而能使集合容纳更多的元素。

code 设置为多大?code 的大小取决于你允许它犯错的概率,即误差分数。误差分数越大,code 越小;误差分数越小,code 的越大且越接近元素本身大小。当误差分数足够小时(约 2 的 -b 次方),code 大小几乎和元素本身一致。如果 P 表示误差分数,则 1 >> P >> 2 的 -b 次方。

所以假设 code 的大小为 c,则 c < b,且 c 的大小应使预期的错误分数接近并小于 P,哈希区域的每个单元的第一位仍然为 1。由于两个不同的消息可能转为同一个 code,所以这种方法会有一定的误差。

方法 2

网上文章讲述的大多是此方法,即将哈希区域被设置为 N 个单独的位置,从 0~N-1,这 N 个位置初始值都是 0,首先,需要将集合中的每个元素使用哈希算法映射在不同的地址上,将这些位置值为 1。当要判断一个元素是否存在某个集合中时,使用同样的哈希算法进行散列,如果对应位置的值都是 1,我们认为这个元素“可能”存在,反之一定不存在。

为什么是“可能”呢?因为随着元素变多,值为 1 的位置将越来越多,可能要判断元素的散列位置,被其他元素恰好都置为 1 了,这时我们以为该元素存在,实际上不存在。

实践

引入 maven 包:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.0-jre</version>
</dependency>

创建一个集合,集合中放 1 亿个元素 0~99999999,然后判断 10000~100009999 在集合中的个数,理论上应该是 99990000 个,实际输出结果是 99990291 个。所以也验证了布隆过滤器确实存在一定误差。

public class BloomFilterDemo {
    public static void main(String[] args) {
        int total = 100000000;
        // 集合中放 1 亿个数
        BloomFilter<Integer> bf = BloomFilter.create(Funnels.integerFunnel(), total);
        for (int i = 0; i < total; i++) {
            bf.put(i);
        }

        // 判断 1 亿个数是否存在集合中
        int ret = 0;
        for (int i = 10000; i < total + 10000; i++) {
            if (bf.mightContain(i)) {
                ret++;
            }
        }

        System.out.println(ret);
    }
}

参考

Space/time trade-offs in hash coding with allowable errors:https://dl.acm.org/doi/10.1145/362686.362692
2. 5 分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有!:https://juejin.cn/post/6844904007790673933

标签:误差,code,元素,布隆,集合,哈希,过滤器,解析
From: https://www.cnblogs.com/rottenorange-cn/p/18147152

相关文章

  • 【爆款推荐】初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高
    PDF格式公众号回复关键字:ZKYDT007原文1WhereareMarkTwain’squotationsalwaysused?解析1Where哪里,are,MarkTwain’squotationsMarkTwain’s语录,alwaysused?总是被使用,被引用马克·吐温的名言总是被用在哪些地方?2MarkTwainisoneofthemostquote......
  • wifi解析方法(简易版,未成功)
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032045出自【进步*于辰的博客】目录1、完整代码2、改成方案3、不成功原因此方法本人尝试未成功,既然未成功,为何我还要发布出来?两个原因:让我对wlan的连接有了初步的了解......
  • 解析SAP系统在企业成本管理中的关键作用与优势
    成本管理对于企业的可持续发展至关重要,而SAP系统作为领先的企业资源规划软件,在企业成本管理中发挥着重要作用。本文将分析SAP系统在企业成本管理中的重要性,探讨SAP系统如何帮助企业降低成本、提高效率,以及实现可持续发展的过程。 第一部分:SAP系统的全面性SAP系统是企业资源规......
  • STM32、ESP8266与MQTT连接阿里云物联网的串口通信异常解析
    STM32、ESP8266与MQTT协议连接阿里云物联网平台时常见的串口通信异常介绍在构建物联网应用时,STM32、ESP8266与MQTT协议的结合是实现设备与网络间稳定通信的关键。然而,在连接阿里云物联网平台的过程中,串口通信异常成为了一个常见的挑战。本文将探讨这些异常现象及其可能的原因,并给......
  • 【爆款推荐】初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高
    PDF格式公众号回复关键字:ZKYDT006原文1Whatdidmanypeopledowhentheyvisitedthemuseum?解析1What什么manypeople很多人do做whentheyvisitedthemuseum当他们参观博物馆时当人们参考博物馆时,他们做什么?2Manypeoplefromallovertheworldvi......
  • C++ 类方法解析:内外定义、参数、访问控制与静态方法详解
    C++类方法类方法,也称为成员函数,是属于类的函数。它们用于操作或查询类数据,并封装在类定义中。类方法可以分为两种类型:类内定义方法:直接在类定义内部声明和定义方法。类外定义方法:在类定义内部声明方法,并在类外部单独定义方法。类内定义方法在类定义内部可以直接声明和......
  • 问题解析
    查看内存总量[root@localhost~]#free-h----人性化显示内存使用情况totalusedfreesharedbuff/cacheavailableMem:1.8G329M270M9.1M1.2G1.2GSwap:4.0G0B......
  • NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧
    NL2SQL实践系列(1):深入解析Prompt工程在text2sql中的应用技巧NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(SpidervsBIRD)全面对比优劣分析[Text2SQL、Text2DSL]NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七年发展脉络梳理NL2SQL进......
  • FICO内部订单详细解析
    内部订单是用来对企业内部某项工作或者任务编制计划、归集成本、结算的载体。比如市场推广活动、内部团队活动、研发项目、投资项目、在建工程项目等。内部订单需要区别于销售订单、采购订单和生产订单。销售订单和采购订单是企业与外部单位以合同或者契约为纽带,在执行交易后,最终......
  • 基于python的文件seek和tell实例解析
    一概念AF.seek(偏移量,whence=相对位置)偏移量大于0的数代表向文件末尾方向移动的字节数小于0的数代表向文件头方向中移动的字节数相对位置0代表从文件头开始偏移1代表从文件当前读写位置开始偏移2代表从文件尾开始偏移Btell函数能够返回指针......