github上java_GitHub上Java的Bloom Bloom实现
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实现相关推荐
- GitHub上Java的Bloom Bloom实现
布隆过滤器是集数据结构的一种 . 对于那些不了解的对象,"设置数据结构"仅包含一个主要方法. 它仅用于确定特定元素是否包含在一组元素中. 大多数数据结构(例如Hash Map , ...
- 2016年GitHub上史上最全的Android开源项目分类汇总
以下内容为转载 版主原网址 http://itindex.net/detail/51896-github-android-开源 GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时 ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- 史上最强Java学习路线
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...
- 史上最强Java学习路线(详解)
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...
- 详解 | 史上最强Java学习路线
Java是一个通用的编程语言,其实可以干很多事,怎么学Java就看怎么用了,但有一些一般的步骤: 熟悉一种文本编辑器,比如:Vim, Emacs, Notepad++, TextMate等.知道哪些是 ...
- 2023史上最全Java面试题【完整版】跳槽必备,看完轻松收撕面试官
✨作者简介:杨 戬,博客专家.github开源作者 ✨多年工作总结:Java学习路线总结,小白逆袭Java技术总监 ✨技术交流:定期更新Java硬核干货,不定期送书活动.助你实现技术飞跃 ✨关注公众号 ...
- 史上最全 Java 多线程面试题及答案
这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题. 这些多线程的问题,有些来源于各大网站.有些来源于自己的思考.可能有些问题网上有.可能有些问题对应的答案也有.也可能有些各位网友也 ...
- 史上最扯Java图形绘制(J2SE)之一JAVA动画效果
很多主一听说Java界面,一水的头大外带血压高,兄弟我倒觉得没什么必要. 其实Java这东西吧,就简便性和其初衷而言,真他妈就在GUI 这地界是有优势的,单就其2D界面开发的易用性 ...
最新文章
- C语言结束输入(两种方法)
- -f shell 模糊匹配_生产力工具:shell 与 Bash 脚本
- 2021高考杭二中成绩查询,浙江高中成绩排名2021,浙江中考分数线排行榜
- jstack 脚本 自动日志_GitLab从安装到全自动化备份一条龙
- JavaSE 学习参考:数组遍历
- Oracle sqlldr 在DOS窗口导入多列数据到数据库表
- 8202v/8202ka/8202kd/8202rd 无线游戏手柄方案
- 前嗅ForeSpider教程:采集预览
- 第四季-专题17-LCD驱动程序设计
- 那些做Android开发必须知道的ADB命令
- Linux/Mono(C#) - System.Data.SQLite- Sqlite.Interop.dll not found 问题
- 分享一款超棒的jQuery Google地图插件:Gmaps
- 基于MicroStation CE的点云软件二次开发
- 如何生成玫瑰?|数字艺术
- 微擎系统换服务器,微擎服务器迁移
- js语言扩展之trim
- 快速Euclidean算法
- 上海钢联朱军红:产业互联网的“双创”之路
- 2月14魔兽服务器维护,魔兽世界2月14日-2月20日世界boss周常任务一览
- STM32 F7的MAC层过滤使用+实例代码