1 布隆过滤器简介

布隆过滤器是一种空间利用率较高的概率型数据结构,用来测试一个元素是否在集合中。但是存在一定可能,导致结果误判。即元素不在集合中,查询结果却返回元素在集合中。

布隆过滤器一些的性质

  • 与哈希表不同,布隆过滤器是一个大小固定的过滤器,可以通过任意大的数字来描述集合大小
  • 添加一个元素到集合中永远不会添加失败,但误报率会随着添加元素数量的增多逐渐上升,直到集合中所有位都设置位1
  • 查询一个元素是否存在会产生误报的可能
  • 不应该从集合中删除元素。例如一个元素对应k的hash函数,当我们尝试删除,可能导致将hash值相同的元素也一并删除。

布隆过滤器的工作方式
一个空的布隆过滤器是一个由m个二进制位构成的数组。

我们需要k个hash函数来计算输入的hash值。当我们向过滤器中添加一个元素事,k个hash函数计算出的索引值 h1(x), h2(x),… hk(x)被设置位1。例如将geeks加入到过滤器中,我们用到3个hash函数,过滤器的长度为10,初始
值被设置为0。哈希函数的计算结果如下:

h1(“geeks”) % 10 = 1
h2(“geeks”) % 10 = 4
h3(“geeks”) % 10 = 7

接着我们将1,4,7位设置位1。

接着我们将nerd添加到集合中,hash值计算结果如下。

h1(“nerd”) % 10 = 3
h2(“nerd”) % 10 = 5
h3(“nerd”) % 10 = 4


如果我们想检查geeks是否在集合中,我们以相反的方式进行处理。我们使用h1,h2,h3计算初hash值。如果对应的二进制位都位1,那么可以判定“geeks”可能在集合中。如果任何一位为0,那么"geeks"一定不在集合中。

布隆过滤器结果误判
假如我们希望判定cat是否在集合中,首先计算hash值。得到1,3,7。但1,3,7是之前添加其它单词后设置的结果,我们之前并没有添加cat,因此造成了误判。

h1(“cat”) % 10 = 1
h2(“cat”) % 10 = 3
h3(“cat”) % 10 = 7

如果我们希望降低误判率,我们需要使用更多的hash函数及更大的数组。

布隆过滤器的误报概率
假设数组长度为m,并使用k个hash函数,n是要插入到过滤器中的元素个数,那么误报率的计算如下:

位数组的大小

如果过滤器中的元素数量已直,期望的误报率位p,那么二进制位数组大小计算公式如下:

最优哈希函数数量
如果m是数组长度,n是插入的元素个数,k是hash函数的个数,k计算公式如下:

哈希函数的选择
哈希函数独立且生成的数值均匀分布,并且尽可能的快。比如MurmurHash、Jenkins_hash_function。

2 Guava提供的布隆过滤器

首先添加依赖,版本可根据实际使用来调整。

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>22.0</version>
</dependency>

创建布隆过滤器时要传入期望处理的元素数量,及最期望的误报的概率。如下分别是500和0.01。

BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(),500,0.01);

接着向过滤器中插入元素。

filter.put(1);
filter.put(2);
filter.put(3);

我们添加了3个元素,并且定义了最大元素数量为500,因此我们的过滤器将会产生非常准确的结果。我们使用mightContain()方法来测试。

assertThat(filter.mightContain(1)).isTrue();
assertThat(filter.mightContain(2)).isTrue();
assertThat(filter.mightContain(3)).isTrue();assertThat(filter.mightContain(100)).isFalse();

因为布隆过滤器是一种概率型数据结构,因此返回true表示元素有极大的概率存在。当返回false那么表示元素一定不存在。

当我们创建布隆过滤器时,尽可能提供准确的元素数量。否则将会产生较高的误报率。

下面的例子表示集合最多5个元素,这样在实际使用时就会产生很高的误报率。

BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(),5,0.01);IntStream.range(0, 100_000).forEach(filter::put);

3 参考资料

[1]布隆过滤器算法介绍,https://www.geeksforgeeks.org/bloom-filters-introduction-and-python-implementation/
[2]Guava中的布隆过滤器,https://www.baeldung.com/guava-bloom-filter

Guava布隆过滤器(boomfilter)使用简介相关推荐

  1. 布隆过滤器 Guava布隆过滤器的使用

    简介 布隆过滤器(Bloom Filter)是1970年由一个叫Bloom的老哥提出的.本质上属于一种数据结构,实际组成是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在 ...

  2. 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter

    文章目录 布隆过滤器 - Redis 布隆过滤器,Guava 布隆过滤器 BloomFilter 1.布隆过滤器的起源,用途 2.布隆过滤器的概念 3.布隆过滤器的优缺点 1.优点 2.缺点 4.应用 ...

  3. Redis Guava 布隆过滤器实现和准确率测试

    测试准确率 布隆过滤器的作用 判断这个数据是否存在于我们的集合中存在就是1 不存在就是0 它的底层实现就是一个二进制的数列 原理, 我们都知道hash算法, 如同给我们的数据加入了一个指纹, 但是ha ...

  4. Guava 布隆过滤器

    在 Guava 项目的11.0版中,一个新的类添加了进来-- BloomFilter(布隆过滤器)类.布隆过滤器是一种独特的数据结构,用以表明元素是否被保存在一个集合(Set)中.有趣的是,布隆过滤器 ...

  5. 布隆过滤器Bloom Filter简介

    背景: 如果在平时我们要判断一个元素是否在一个集合中,通常会采用查找比较的方法,下面分析不同的数据结构查找效率: 采用线性表存储,查找时间复杂度为O(N) 采用平衡二叉排序树(AVL.红黑树)存储,查 ...

  6. 大数据算法系列——布隆过滤器

    大数据算法系列--布隆过滤器 一.简介 Bloom filter介绍 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集 ...

  7. 算法练习day12——190331(哈希函数、哈希表、布隆过滤器、一致性哈希)

    1.哈希函数 1.1 特点: 经典的哈希函数输入域是无穷大的. 输出域是有穷尽的: 相同输入得到的输出肯定是一样的: 不同的输入得到的输出也可能一样(输入域>输出域); 哈希函数的离散型:给定多 ...

  8. 【恋上数据结构】布隆过滤器(Bloom Filter)原理及实现

    布隆过滤器(Bloom Filter) 引出布隆过滤器(判断元素是否存在) 布隆过滤器介绍(概率型数据结构) 布隆过滤器的原理(二进制 + 哈希函数) 布隆过滤器的误判率(公式) 布隆过滤器的实现 布 ...

  9. 布隆过滤器 布谷鸟过滤器 Redis 安装布隆过滤器

    布隆过滤器 &布谷鸟过滤器 & Redis 安装布隆过滤器 1.布隆过滤器 1.1 简介 百度百科:布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的 ...

最新文章

  1. 不要争了,别的程序员是这么给变量起名的!
  2. JavaScript最全的10种跨域共享的方法
  3. run sequence between odata request and controller init
  4. eth一张_听说eth2.0利好落地了?那么为何eth反而涨了?
  5. MySQL之使用视图
  6. 【Java从0到架构师】SQL 多表查询
  7. win10 安装oracle11g R2的64位版本
  8. 瑞虎7linux车机,颜值更高/车机系统运行快 实拍奇瑞瑞虎7神行版
  9. 曲线运动与万有引力公式_专题三曲线运动与万有引力定律
  10. Relational Knowledge Distillation解读
  11. 什么促使计算机图形学发展,计 算 机 图 形 学 的 过 去、 现 在 和 未 来.doc
  12. Android BottomNavigationView的使用
  13. .fasta文件的相关处理
  14. JS复制文本到粘贴板,前端H5移动端点击按钮复制文本到粘贴板。
  15. Contacts管理系统通讯录
  16. Selenium使用浏览器自动登录校园网
  17. 无论是狗粮还是降落伞,反正WeLink来了……
  18. 物联网资产标记方法介绍
  19. python爬虫微博24小时热搜_Python爬虫之微博热搜
  20. 刘慈欣回应《流浪地球》热点问题:承认有些设定有bug

热门文章

  1. 流量监控--nload工具详解
  2. 050B 基于最大熵模型软件(MaxEnt)和ArcGis地理系统的分布区(适生区)预测教程
  3. CAD二次开发命令窗口交互(COM接口c#语言)
  4. d我读过的(股票)书籍
  5. MacRansom:首款以RaaS服务形式出现的Mac勒索软件
  6. 云学院带你入门云计算:如何理解IaaS、 PaaS、SaaS
  7. 《全球化陷阱》:“奶头乐”理论,是“娱乐至死”还是明知不易,仍然前行。
  8. HTML5QQ登录cav demo
  9. i7 1165g7核显相当于什么显卡
  10. Java入门:代码基础