谷歌guava_Google Guava BloomFilter

谷歌guava

当Guava项目发布版本11.0时,新添加的功能之一是BloomFilter类。 BloomFilter是唯一的数据结构,用于指示元素是否包含在集合中。 使BloomFilter有趣的是,它将指示元素是否绝对不包含或可能包含在集合中。

永远不会出现假阴性的特性使BloomFilter成为用作警戒条件的绝佳候选者,以帮助防止执行不必要和昂贵的操作。 虽然BloomFilters最近获得了很好的曝光,但使用它意味着滚动自己的浏览器或通过Google搜索代码。 滚动自己的BloomFilter的麻烦在于获取正确的哈希函数来制作过滤器

有效。 考虑到Guava使用Murmur Hash来实现,我们现在就拥有了一个有效的BloomFilter的有用性,而该库只是一个库。

BloomFilter速成课程

BloomFilters本质上是位向量。 在较高级别,BloomFilters以下列方式工作:

  1. 将元素添加到过滤器。
  2. 将其哈希几次,然后将索引与哈希结果匹配的位设置为1。

测试元素是否在集合中时,请遵循相同的哈希过程,并检查这些位是否设置为1或0。此过程是BloomFilter如何保证元素不存在的方法。 如果未设置这些位,则根本不可能将该元素放入集合中。 但是,肯定答案表示元素在集合中或发生哈希冲突。 可以在此处找到有关BloomFilter的更详细的描述,并在此处找到有关BloomFilters的良好教程。 根据Wikipedia的说法,Google在BigTable中使用BloomFilters来避免对不存在的项目进行磁盘查找。 另一个有趣的用法是使用BloomFilter优化SQL查询 。

使用番石榴BloomFilter

通过调用BloomFilter类上的static方法create来创建Guava BloomFilter,
传递一个Funnel对象和一个int表示预期的插入次数。 漏斗也是Guava 11中的新功能,它是一个可以将数据发送到Sink的对象。 以下示例是默认实现,并且误报的百分比为3%。 Guava提供了一个Funnels类,其中包含两个静态方法,这些方法提供Funnel接口的实现,用于将CharSequence或字节数组插入到过滤器中。

//Creating the BloomFilter
BloomFilter bloomFilter = BloomFilter.create(Funnels.byteArrayFunnel(), 1000);//Putting elements into the filter
//A BigInteger representing a key of some sort
bloomFilter.put(bigInteger.toByteArray());//Testing for element in set
boolean mayBeContained = bloomFilter.mayContain(bitIntegerII.toByteArray());

更新:基于路易斯·沃瑟曼的评论,以下是如何使用自定义Funnel实现为BigIntegers创建BloomFilter的方法:

//Create the custom filter
class BigIntegerFunnel implements Funnel<BigInteger> {@Overridepublic void funnel(BigInteger from, Sink into) {into.putBytes(from.toByteArray());}}//Creating the BloomFilter
BloomFilter bloomFilter = BloomFilter.create(new BigIntegerFunnel(), 1000);//Putting elements into the filter
//A BigInteger representing a key of some sort
bloomFilter.put(bigInteger);//Testing for element in set
boolean mayBeContained = bloomFilter.mayContain(bitIntegerII);

注意事项

正确估计预期插入的数量至关重要。 当插入过滤器的次数接近或超过预期的数目时,BloomFilter开始填满,结果将产生更多的误报,直至无用之地。 还有另一个版本的BloomFilter.create方法,该方法带有一个附加参数,双精度表示所需的错误命中概率级别(必须大于0且小于1)。 错误命中概率的级别会影响用于存储或搜索元素的哈希数。 所需的百分比越低,执行的哈希数越高。

结论

BloomFilter是开发人员可以在其工具箱中使用的有用项。 现在,Guava项目使在需要时开始使用BloomFilter变得非常简单。 希望您喜欢这篇文章。 欢迎提出有用的意见和建议。

参考资料

  • Guava BloomFilter的单元测试演示 。
  • BloomFilter类
  • 您想知道的所有关于BloomFilters的信息 。
  • BloomFilter教程 。
  • Wikipedia上的BloomFilter 。

参考:来自我们的JCG合作伙伴 Bill Bejeck的Google Guava BloomFIlter,来自“ 随机思考编码”博客。

翻译自: https://www.javacodegeeks.com/2012/12/google-guava-bloomfilter.html

谷歌guava

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMDB学习之三数据采集

判断系统因为是公用的方法&#xff0c;所有要写基类方法使用&#xff0c;首先在插件中创建一个基类 将插件文件继承基类 思路是创建基类使用handler.cmd ,命令去获取系统信息&#xff0c;然后进行判断&#xff0c;然后去执行 磁盘 &#xff0c;cpu&#xff0c;网卡&#xff0c;…

linux下挂载iso镜像的方法

新建目录/mnt/cdrom 执行命令 mount /dev/cdrom /mnt/cdrom 12[rootocdp1 cdrom]# mount /dev/cdrom /mnt/cdrommount: /dev/sr0 写保护&#xff0c;将以只读方式挂载进入/mnt/cdrom文件夹下发现里面是空的&#xff0c;说明挂载失败。 现在很多发行版中&#xff0c;光驱都不是/…

android onitemclicklistener 参数,android – OnItemClickListener从模型中获取数据

我是Android开发的新手,我正在尝试构建一个ListView,它使用gson从Web服务获取数据.我有一个模型类,一个列表类,一个适配器类和活动类.该列表工作正常,它获得了数据,现在我想将OnItemClickListener集成到它并将数据传递给第二个活动.我想得到项ID(DistrictId)并将其传递给下一个…

Java 8:对速度3.0.1“森林”流ORM的更深入了解

沿着这条路 我一直在为开源项目Speedment &#xff08;它是Stream ORM Java Toolkit和Runtime&#xff09;做出贡献&#xff0c;并且刚刚发布了一个新的主要版本3.0.1“ Forest”。 版本的发布以加利福尼亚州帕洛阿尔托的大街小巷命名&#xff0c;大多数贡献者都在这里工作。 沿…

读《人月神话》有感

翻开《人月神话》这本书&#xff0c;我感觉看这本与我们学的相关的书不相似&#xff0c;书中用了很多的形象的比喻&#xff0c;来阐述项目管理中的一些问题&#xff0c;让人以很轻松愉悦心态去阅读。书开始就形象有有趣的把软件危机比作&#xff1a;焦油坑。让我感觉到&#xf…

android 弹窗in,Android监听程序处于INACTIVITY(未操作状态)时间并作出相应的操作

最近遇到一个需求&#xff0c;app五分钟未操作需要返回到主页面。一开始就想到去监听onTouch和onClick事件&#xff0c;这个方法看似可行&#xff0c;但是实际操作起来还是很繁琐的&#xff0c;一不小心就达不到需要的效果。然后就果断放弃了。后来看api发现activity中有一个叫…

用gdb调试nasm汇编程序

对于一个程序员来说&#xff0c;调试是很重要的&#xff0c;可以节约找到bug的时间&#xff0c;不过以前在linux下一直是对c进行调试的&#xff0c;今天突然要对汇编进行调试还真不知道怎么调&#xff0c;特别是对linux下调试汇编程序基本没搞过。记得以前上课学masm时&#xf…

android 防腾讯新闻标题栏,仿腾讯视频android客户端上方的标题栏

如图&#xff0c;上方的导航栏是不是很酷&#xff0c;首先它本身是可以滑动的&#xff0c;然后右侧有一个可以查看所有Tab的按钮&#xff0c;然后他和下方的ViewPager还是联动的&#xff0c;可以通过点击它切换ViewPager&#xff0c;并且ViewPager滑动&#xff0c;它也会随着改…

链接克隆 完整克隆_深入克隆

链接克隆 完整克隆在继续克隆概念之前&#xff0c;让我们用对象创建概念刷新基础知识。 使用new运算符创建对象时&#xff0c;对象将在堆中获取内存分配。 堆中的对象创建 在Java中&#xff0c;理想情况下仅通过引用变量修改对象&#xff0c;即仅复制对象的内存地址&#xff…

linux系统调用和库函数调用的区别

Linux下对文件操作有两种方式&#xff1a;系统调用&#xff08;system call&#xff09;和库函数调用&#xff08;Library functions&#xff09;。可以参考《Linux程序设计》&#xff08;英文原版为《Beginning Linux Programming》&#xff0c;作者是Neil Matthew和Richard S…

如果您在2016年编写过Java代码-这是您不容错过的趋势

2016年最有趣的Java相关主题 关于代码&#xff0c;有很多热门话题&#xff0c;而要跟上所有事情&#xff0c;这是一项全职的工作。 如果您想知道如何从谷壳中分离出小麦&#xff0c;我们已经为您完成了工作。 在下面的文章中&#xff0c;我们将介绍2016年最热门的内容&#x…

第三届蓝桥杯省赛---第39级台阶

第39级台阶 小明刚刚看完电影《第39级台阶》&#xff0c;离开电影院的时候&#xff0c;他数了数礼堂前的台阶数&#xff0c;恰好是39级! 站在台阶前&#xff0c;他突然又想着一个问题&#xff1a; 如果我每一步只能迈上1个或2个台阶。先迈左脚&#xff0c;然后左右交替&#xf…

android 视图覆盖,如何在Android中添加覆盖视图超过其他视图?

设为背景&#xff01;只是开玩笑…你需要的是把你的意见放在一个RelativeLayout里.会有什么工作&#xff1a;xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"fill_parent"android:layout_height"fill_parent"&…

Linux内核源码分析方法

一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”&#xff0c;也正因为如此&#xff0c;使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux&#xff0c;深入操作系统的本质&#xff0c;阅读内核源码是最有效的途径。我们都知道&#xff0c;想成为优秀的程序…

深度学习框架Keras介绍及实战

Keras 是一个用 Python 编写的高级神经网络 API&#xff0c;它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速的实验。能够以最小的时延把你的想法转换为实验结果&#xff0c;是做好研究的关键。 本文以Kaggle上的项目:IMDB影评情感分析为例,…

操作系统--处理机调度

4 处理机调度 4.1 调度类型 操作系统必须为多个进程的竞争请求分配计算机资源。处理机调度的任务就是选出待分派的作业或进程&#xff0c;为之分配处理机。 为了便于处理机调度管理&#xff0c;通常在处理机调度中采用分级调度方式&#xff0c;其中包括以下3级调度&#xff1a;…

permgen_什么是PermGen泄漏?

permgen接下来是对Java应用程序中特定类型的内存问题的实用介绍。 即–我们将分析导致java.lang.OutOfMemoryError&#xff1a;PermGen空间的错误 堆栈跟踪中的症状。 首先&#xff0c;我们将介绍理解该主题所需的核心概念&#xff0c;并解释什么是对象&#xff0c;类&#…

TP、PHP同域不同子级域名共享Session、单点登录

TP、PHP同域不同子级域名共享Session、单点登录 目的&#xff1a; 为了部署同个域名下不同子级域名共享会话&#xff0c;从而实现单点登录的问题&#xff0c;一处登录&#xff0c;同域处处子系统即可以实现自动登录。 PHP支持通过设置cookie使得同域不同子域共享SESSION 1. 通…

html语言书写注意事项,HTML注意事项(学习笔记)

1、在所有浏览器中都是有效的&#xff0c;但使用 其实是更长远的保障。类似的标签也一样2、标签最好用小写&#xff0c;未来的版本中可能强制用小写3、标签属性始终为属性值加引号属性值应该始终被包括在引号内。双引号是最常用的&#xff0c;不过使用单引号也没有问题。在某些…

UTF-8、GB2312、GB18030、GBK和BIG5等字符集编码范围的具体说明

一预备知识 1&#xff0c;字符&#xff1a;字符是抽象的最小文本单位。 它没有固定的形状&#xff08;可能是一个字形&#xff09;&#xff0c;而且没有值。 “A”是一个字符&#xff0c;“”&#xff08;德国、法国和许多其他欧洲国家通用货币的标志&#xff09;也是一个字…