github上java

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

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

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

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

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

对于每个数据结构,肯定都有向布隆过滤器退缩的缺点。 通过使用上述方法,布隆过滤器可以说元素实际上不在集合中。 假阳性可能在集合中,并且取决于几个因素,例如:

  • 字节数组的大小
  • 每个元素设置的位数(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

github上java_GitHub上Java的Bloom Bloom实现相关推荐

  1. GitHub上Java的Bloom Bloom实现

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

  2. 2016年GitHub上史上最全的Android开源项目分类汇总

    以下内容为转载 版主原网址 http://itindex.net/detail/51896-github-android-开源 GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时 ...

  3. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  4. 史上最强Java学习路线

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...

  5. 史上最强Java学习路线(详解)

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...

  6. 详解 | 史上最强Java学习路线

    Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...

  7. 2023史上最全Java面试题【完整版】跳槽必备,看完轻松收撕面试官

    ✨作者简介:杨 戬,博客专家.github开源作者 ✨多年工作总结:Java学习路线总结,小白逆袭Java技术总监 ✨技术交流:定期更新Java硬核干货,不定期送书活动.助你实现技术飞跃 ✨关注公众号 ...

  8. 史上最全 Java 多线程面试题及答案

    这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...

  9. 史上最扯Java图形绘制(J2SE)之一JAVA动画效果

    很多主一听说Java界面,一水的头大外带血压高,兄弟我倒觉得没什么必要.           其实Java这东西吧,就简便性和其初衷而言,真他妈就在GUI 这地界是有优势的,单就其2D界面开发的易用性 ...

最新文章

  1. C语言结束输入(两种方法)
  2. -f shell 模糊匹配_生产力工具:shell 与 Bash 脚本
  3. 2021高考杭二中成绩查询,浙江高中成绩排名2021,浙江中考分数线排行榜
  4. jstack 脚本 自动日志_GitLab从安装到全自动化备份一条龙
  5. JavaSE 学习参考:数组遍历
  6. Oracle sqlldr 在DOS窗口导入多列数据到数据库表
  7. 8202v/8202ka/8202kd/8202rd 无线游戏手柄方案
  8. 前嗅ForeSpider教程:采集预览
  9. 第四季-专题17-LCD驱动程序设计
  10. 那些做Android开发必须知道的ADB命令
  11. Linux/Mono(C#) - System.Data.SQLite- Sqlite.Interop.dll not found 问题
  12. 分享一款超棒的jQuery Google地图插件:Gmaps
  13. 基于MicroStation CE的点云软件二次开发
  14. 如何生成玫瑰?|数字艺术
  15. 微擎系统换服务器,微擎服务器迁移
  16. js语言扩展之trim
  17. 快速Euclidean算法
  18. 上海钢联朱军红:产业互联网的“双创”之路
  19. 2月14魔兽服务器维护,魔兽世界2月14日-2月20日世界boss周常任务一览
  20. STM32 F7的MAC层过滤使用+实例代码

热门文章

  1. Spring Bean 定义
  2. Java中的OutOfMemoryError
  3. HikariCP-史上最快速的连接池
  4. 金融系统中正确的金额计算及存储方式
  5. Java7任务并行执行神器:ForkJoin框架
  6. java之正则表达式
  7. 12-多对一添加操作(添加新客户及对应的新订单)
  8. java synchronized 使用_Java中synchronized的使用实例
  9. python 高维数据_Python数据分析入门|利用NumPy高效处理高维数据
  10. 编译内核_将驱动编译进内核(Kernel)的步骤记录