布隆过滤器是集数据结构的一种 。 对于那些不了解的对象,“设置数据结构”仅包含一个主要方法。 它仅用于确定特定元素是否包含在一组元素中。 大多数数据结构(例如Hash Map , Linked List或Array )都可以相当轻松地创建此函数。 您只需要在数据结构中搜索特定元素。

但是,当集合中的元素数量超过可用内存量时,这些类型的数据结构可能会带来问题,因为这些类型的数据结构会将所有元素存储在内存中。

这是布隆过滤器变得有趣的地方。 因为布隆过滤器实际上并未将集合中的所有元素存储在内存中。

布隆过滤器没有将每个元素放入数据结构中,而是仅存储字节数组。 对于添加到布隆过滤器的每个元素,在其数组中设置k位。 这些位通常由哈希函数确定。

要检查元素是否在集合中,只需检查通常对于该项目通常为1的位是否实际上为1。 如果它们都是一(而不是零),则该项在集合内。 如果任何一位都不为1,则该项目不在集合内。

对于每个数据结构,肯定都会退回到Bloom Filter。 通过使用上述方法,布隆过滤器可以说元素实际上不在集合中。 假阳性在该集中是可能的,它们取决于几个因素,例如:

  • 字节数组的大小
  • 每个元素设置的位数(k)
  • 集合中的项目数

通过调整上述值,您可以轻松地将误报概率提高到可观的水平,同时仍然节省大量空间。

发现布隆过滤器后,我开始寻找Java实现。 可悲的是,不存在标准实现! 因此,我编写了一个简单快速的Java版Bloom Filter版本。 您可以在GitHub上找到源代码 。

我的实现使用:

  • MD5哈希

    • 要添加一个Object,该集合采用hashCode()方法的值来计算MD5哈希。
  • 由简单的字节数组支持
  • 实现Set <Object>接口,尽管该接口中的某些方法将无法正常工作。

请注意,该项目还使用SizeOf库来获取内存中使用的字节数。

我还做了一些快速到期操作,以将过滤器与Java中的标准ArrayList进行比较,并进行了一些性能检查。

  • 使用不同的k值将元素添加到集合中所需的时间
  • 集合的大小与不同级别的数组列表

可以预期,集合中需要的元素数量越多,Bloom Filter变得越有用。 当确定布隆过滤器应该有多大以及给定集合的最佳k值时,确实会有些棘手,尤其是在集合不断增长的情况下。

对于测试,我仅向每个数据结构添加了对象(大小为16个字节),然后使用SizeOf库获取使用的真实空间量。

从上图可以很容易地看出,一旦数组变得大于100个对象,Bloom Filter的大小效率就会大大提高。 这种趋势持续到1500个对象,而布隆过滤器需要比ArrayList少22808字节来存储相同数量的元素。

上图显示了以秒为单位的时间(在2012年早期的iMac上),将元素添加到具有不同位数(k)的列表中的时间。 随着k的增加,时间会相当缓慢地增加到10位。 但是,任何超过10的东西都会变得非常昂贵,设置100位需要一整秒才能完成。

随时在GitHub上检查测试的源代码和Bloom Filter实现本身。

参考:来自我们的JCG合作伙伴 Isaac Taylor在Programming Mobile博客上的GitHub上的Java中Bloom过滤实现 。

翻译自: https://www.javacodegeeks.com/2012/11/bloom-filter-implementation-in-java-on-github.html

GitHub上Java的Bloom Bloom实现相关推荐

  1. github上java项目_GitHub上10,000个最受欢迎的Java项目-以下是他们使用的顶级库

    github上java项目 随着Java开发人员使用既成熟又高度发展的语言来工作,无论何时编写新代码,我们都将面临一个持续的困境–使用大家都在谈论的热门新技术,或者坚持使用久经考验的库? 由于Java ...

  2. GitHub上Java捕鱼达人源码分析(fishlord)

      看到CSDN首页有介绍Java编写的捕鱼达人的文章,于是在GitHub上搜了几个Java编写的开源的仿捕鱼达人的项目,准备学习一下编写思路.本文介绍其中比较简单的一个项目fishlord,GitH ...

  3. GitHub上Java捕鱼达人源码分析(catchFish)(一)

      本文准备分析的捕鱼达人项目是GitHub中的catchFish,地址为https://github.com/weiyinfu/catchFish.首先是将项目文件下载到本地,由于本项目是Maven ...

  4. java t没有缩进,Github上Java Eclipse项目的奇怪缩进

    Everything is good in Eclipse, indenting is fine. Then I put my code on github and for some reason t ...

  5. github上java_GitHub上Java的Bloom Bloom实现

    github上java 布隆过滤器是集数据结构的一种 . 对于那些不了解的对象,"设置数据结构"仅包含一个主要方法. 它仅用于确定特定元素是否包含在一组元素中. 大多数数据结构(例 ...

  6. GitHub上最牛逼的10个Java项目,号称Star收割机,Dubbo只能排 12

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「阿飞的博客」 1. CS-Notes ...

  7. 集合70多种推荐算法,东北大学老师用Java写了一个开源库,在GitHub上收获近1500个Star...

     [AI科技大本营导读]在经过一年多的开发工作之后,LibRec 3.0 版本终于发布了.LibRec 是一个基于 Java 的开源算法工具库,覆盖了 70 余个各类型推荐算法,可以有效解决评分预测 ...

  8. GitHub上的编程语言:JavaScript领衔Java次之

    最近,Linguist项目统计了代码托管网站GitHub上各类编程语言的热度.下图展示了自2008年以来各编程语言的排名状况及它们的相对热度. \\ \\ 从上图中可以看出,Perl已经不再流行,C# ...

  9. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

最新文章

  1. 数据的统计特征量有哪些
  2. Win2008 R2 RemoteApp深度体验之四,RemoteApp程序测试
  3. id3决策树 鸢尾花 python_决策树算法——集成学的基础!
  4. mongodb 开启身份认证_Yum安装mongodb及开启用户认证远程登录
  5. Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
  6. java 排序stackoverflow_JAVA开发知识点
  7. 微软发布最新开源Blog平台“Oxite”
  8. mybatis中条件表达式if的test为字符串时值比较
  9. 神经网络思想建立LR模型(DL公开课第二周答案)
  10. 贺利坚老师汇编课程56笔记:CMP指令
  11. 51Nod-1136 欧拉函数
  12. App.xaml MainWindow.xaml
  13. [无线连接手机]-通过局域网无线连接调试手机设备
  14. 输入一个整数判断其是否是回文数
  15. python热图_Python 绘制热图
  16. Android动画(一)
  17. 搭建USB摄像头转RTSP服务器的多种方法
  18. 使用python中openpyxl模块操作excel文件,计算单元格分子式的相对分子质量(二)
  19. 电脑蓝屏代码错误分析及解决方案
  20. 计算机SCI期刊投稿,除了投稿信,还要做什么准备? - 易智编译EaseEditing

热门文章

  1. ffmpeg中文开发手册_快速调用复杂命令,支持中文注释,命令行备忘工具navi两天就火了...
  2. 基于springboot2.5.5自建启动器starter制品库
  3. Java BigDecimal和double区别
  4. buildpack_使用Buildpack容器化Spring Boot应用程序
  5. java oca_OCA的Java拼图游戏第3部分
  6. hibernate 标识符_Hibernate中的标识符
  7. spring flux_Spring Web-Flux – Cassandra后端的功能样式
  8. swarm 本地管理远程_带有WildFly Swarm的远程JMS
  9. c++ lambda 重载_您会后悔对Lambdas应用重载!
  10. java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验