Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。

Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。Bloom Filter的这种高效是有一定代价的:在判断一个元素是否属于某个集合时,有可能会把不属于这个集合的元素误认为属于这个集合(false positive)。因此,Bloom Filter不适合那些“零错误”的应用场合。而在能容忍低错误率的应用场合下,Bloom Filter通过极少的错误换取了存储空间的极大节省。

比如10亿个int类型的数,如果用int数组存储的话,那么需要大约4G内存,浪费内存。如果用bitmap解决,就比较方便。java语言中没有bitmap结构,我们采用byte模拟。一个byte占8个bit,如果每一个bit的值是1或0,代表有或没有。下图所示:

构建特定长度的byte数组(new byte[capacity/8 + 1]),其中capacity为整数数组长度(如:1000个数字,就是1000/8)

计算数字num在byte[]中的位置索引(num/8和num >> 3一样),也就是说num在byte[k]中的索引,计算索引k

计算数字num在byte中的位置,就是在byte的第几位,每个byte有8位(num % 8),采用二进程与计算

找到该数字存储位置后,将bit中的0变成1,即表示该数已存在bitmap中,如图

判断指定数字num是否存在数组中

完整代码:

bitmap的java原理_布隆算法的原理及JAVA实现相关推荐

  1. 聚类算法的java实现_聚类算法之BIRCH(Java实现)

    BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)天生就是为处理超大规模(至少要让你的内存容不下)的数据集而设计的, ...

  2. 神经网络算法 java 源代码_神经网络算法与实现 ——基于Java语言 代码实例

    [实例简介] Neural Network Programming with Java_ ISBN 978-7-115-46093-6 [实例截图] [核心代码] NeuralNetworkProgr ...

  3. 堆排序算法讲解视频java版_堆排序算法的讲解及Java版实现

    堆是数据结构中的一种重要结构,了解了"堆"的概念和操作,可以快速掌握堆排序. 堆的概念堆是一种特殊的完全二叉树(complete binary tree).如果一棵完全二叉树的所有 ...

  4. java寻优算法_模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径...

    模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...

  5. 匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)

    匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法.换句话说就是,在可以接受的时间内去做匹配. 1. 描述问题 给定2个集合A和B,然后将AB中的元素完成一个连线.(这不就是小时候的连线题么 ...

  6. 线性回归算法数学原理_线性回归算法-非数学家的高级数学

    线性回归算法数学原理 内部AI (Inside AI) Linear regression is one of the most popular algorithms used in differen ...

  7. java 全景_一种全景图浏览器的JAVA实现算法

    一种全景图浏览器的JAVA实现算法 宋利;周源华;周军 [期刊名称]<计算机应用与软件> [年(卷),期]2003(020)012 [摘要]全景图(panorama image)是近来出现 ...

  8. java 堆排序算法_堆排序算法的讲解及Java版实现

    这篇文章主要介绍了堆排序算法的讲解及Java版实现,堆排序基于堆这种数据结构,在本文中对堆的概念也有补充介绍,需要的朋友可以参考下 堆是数据结构中的一种重要结构,了解了"堆"的概念 ...

  9. java 墨卡托投影_墨卡托投影算法应用---获取辖区某区域的精准电子围栏

    背景:某项目做区域监控,需要内置某些区域的电子围栏. 方案:利用某度接口中墨卡托投影值,进行经纬度转换,入库保存后,让前端获取. 前置数据:区域文案名清单 接口1:  查询某区域的uid http:/ ...

最新文章

  1. Java类加载器详解
  2. 1.2 - C#语言习惯 - 用运行时常量readonly而不是编译期常量const
  3. R语言ggplot2可视化将图例移动到分面图(facet)中的空白分面区域实战
  4. mysql mariadb并存_MariaDB与MySQL并存
  5. 清除ASP.Net缓存
  6. 一种轻量级的C4C业务数据同步到S/4HANA的方式:Odata通知 1
  7. linux打包cpio命令例子,linux压缩命令——tar、cpio详解
  8. Numpy 之Fancy indexing
  9. Laravel核心解读--Contracts契约
  10. php ajax勾选框提交,jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例...
  11. oracle 下和 db2的syscat 对应的,oracle db2命令对比(整理中)
  12. 【OpenCV】图像的内存分配与释放以及复制图像
  13. 记录:编译opencv-4.1.0、opencv_contrib-4.1.0、dense_flow过程
  14. ​​公众平台测试账号 开通 配置
  15. 无线通信模块种类和优点
  16. 将靠父id的层级关系处理成编码形式
  17. 电脑怎么装linux系统
  18. Tips: Python语言中,《三国演义》人物出场统计
  19. mysql 抢票_PHP 高并发、抢票、秒杀 解决方案
  20. coolnbsp;sensor/image/videonbsp;technbsp;cou…

热门文章

  1. Mockito 101
  2. Java 8快多少?
  3. 将AspectJ与NetBeans平台开发集成
  4. Java 7试用资源
  5. JavaEE概念简介
  6. OutOfMemoryError:Java堆空间–分析和解决方法
  7. GWT,GWT-Ext(SmartGWT),GXT(Ext GWT)常见任务
  8. 计算机活动天窗,玩出花样,天窗的正确打开方式
  9. html 按钮防止多次提交,HTML点击提交按钮两次
  10. copyof java_JDK10——copyOf方法