BitMap位图理解及典型应用案例

基本介绍

        本质上是哈希表的一种应用实现,原理简单,以 bit 为单位构建数组的方案,就叫作 Bitmap,翻译为位图。即bit 的集合;使用一个bit表示状态, 两种状态 (0不存在和1存在) 使用最少字节的类型来定义数组,即最小的空间存储数据标识。

        位图适合对【数值类型】的海量数据进行查询统计、排序、去重 和 对两个集合做交集、并集运算;bitmap在数据连续的时候,非常节省空间,但是在数据稀疏的时候,会有极大的浪费,当出现hash碰撞时可能映射到同个位置;

业务应用

        日活/月活UV统计、签到统计、用户点赞,用户签到,访问计数,在线用户数等

典型案例应用解析

1)找存在的UserId

        一个32位4G内存的操作系统,在20亿个整数,找出某个数X是否存在其中,在Java环境中int占4个字节,一个字节占8位。

方式1:将用户id存到集合,那么需要消耗20亿*4*8=640亿位=640/8/1024/1024/1024=7.48GB

方式2:不存储具体数值,仅存储是否存在,存在1不存在0,20亿位/8/1024/1024/1024=0.23GB

解决方案:

1)使用数组处理

        每个int类型可标识32个整数,存储20亿个元素需要20亿个比特位,20亿/8/1024/1024 约上200多MB,省32倍空间。需要申请的数组大小,总的数组长度为20亿/32 +1。

array[0]:可表示0~31,array[1]:可表示32~63,array[2]可表示64~95

        如何确定位置(给定任意整数M,那么M/32就得到下标,M%32就知道它在此下标的哪个位置)

如元素存储 80,确定所在数组的bit位置
1、数组index索引  80/32 = 2.5,即第3个数组的位置 arr[2]
2、比特位index索引 80%32 = 16,索引下标为16的比特位,把比特位设置为1,即arr[2][16]

2)使用redis使用bitmap数据结构处理

Redis中提供的BitMap命令:setbit,getbit,bitcount检测用户是存在(checkUserIsExsits是Key):setbit checkUserIsExsits user-uid 101024511例子:setbit checkUserIsExsits  101024511是否存在判断:getbit  checkUserIsExsits  user-uid例子:getbit checkUserIsExsits 101024511如果不存在状态是0,如果已存在就是1统计当前有多少个用户bitcount checkUserIsExsits返回值为该key值中1的个数

2)找不存在的随机数

需求:有1千万个随机数,随机数的范围在1到1亿之间,将1到1亿之间没有在随机数中的数求出来

前提条件:使用java现有数据结构或自定义数据结构,要求高效和省空间

解决方案:遍历X亿个数字,映射到BitMap中,对于给出的数,直接判断指定的位上存在不存在即可

public static void testBitMap2(){//范围int range = 100;//个数int totalNum = 10;List<Integer> list=new ArrayList<>();//1.声明一个BitSetBitSet bitSet = new BitSet(range);//2.生成1千万个随机数for (int i = 0; i < totalNum; i++) {int random = (int) (Math.random() * range);bitSet.set(random);list.add(random);}System.out.println("产生的随机数:"+list);System.out.println("bitmap是1的个数(存在重复随机送):"+bitSet.cardinality());System.out.println("bitmap是size:"+bitSet.size());System.out.println("bitmap是length(bitmap里面占据的位数是1的位数+1):"+bitSet.length());//3.遍历BitSet,将没有出现的数打印出来for (int i = 0; i < range; i++) {if (!bitSet.get(i)) {System.out.print(i+",");}}}

该数据结构缺点

数据碰撞:字符串映射到 bitmap会有碰撞问题,即可能映射到同个位置,即hash碰撞

稀疏数据:不连续的数据容易浪费空间,比如存入1和88两个数,需要构建长度89的数组,表示索引从1到88,所以需要构建一个长度为89的数组,存放1到88的元素,但实际只存储2个数字。

如果用户的ID的数据类型是int32的话,那么最大值是2^32,需要用512MB的字节的位图来表示,2^32bit=4294967296 比特(bit)=512 兆字节(MB)。

如果只往bitmap存储一个最大值,那边需要申请512 兆字节(MB),大大浪费空间

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

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

相关文章

【蓝桥杯嵌入式】四、各种外设驱动(六)生成PWM波——呼吸灯

温馨提示&#xff1a;本文不会重复之前提到的内容&#xff0c;如需查看&#xff0c;请参考附录 【蓝桥杯嵌入式】附录 目录 理论知识&#xff1a; 一、需求分析 1、需要的外设资源分析&#xff1a; 2、外设具体分析&#xff1a; 3、软件分析&#xff1a; 二、软件配置 …

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后&#xff0c;安装WSL2&#xff0c;最后安装WSL的Ubuntu发布版&#xff0c;尝试网上各种方法&#xff0c;还是出现文章第三节所写的问题&#xff0c;差点被这问题搞放弃了&#xff0c;全网少有针对这个问题的答案&#xff0c;有也不顶用&…

开源漏扫工具:DependencyCheck

开源漏扫工具&#xff1a;DependencyCheck Dependency-Check 是 OWASP&#xff08;Open Web Application Security Project&#xff09;的一个实用开源程序&#xff0c;用于识别项目依赖项并检查是否存在任何已知的&#xff0c;公开披露的漏洞。 DependencyCheck是一个开源的…

景联文科技:提供通用多模态数据,助力AI多模态领域实现飞跃式发展

回顾2023年&#xff0c;以ChatGPT为代表的通用人工智能大模型在全球范围内掀起了新一轮人工智能产业发展浪潮&#xff0c;我国人工智能大模型市场呈现百“模”争鸣、日新月异的迅猛发展态势。 根据大模型之家、钛媒体数据&#xff0c;2023年中国大模型市场规模达到147亿人民币&…

《古滇传说水龙吟》反派敖诀

2024年2月28日&#xff0c;演员李亚云参演新剧古滇传说原创系列剧第一部《水龙吟》在浙江横店影视城开机拍摄。该剧由中共昆明市西山区委宣传部、石林县委宣传部、昆明滇池国家旅游度假区管委会文旅投促局、云南民族电影制片厂、云南卫视、昆明影视拍摄服务中心支持&#xff0c…

如何在CasaOS系统玩客云中安装内网穿透工具实现远程访问内网主机下载资源

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&#xff0c;但…

T01.springboot入门

1.第一步&#xff1a; 2.第二步&#xff1a; 添加后&#xff0c;再启动一下

Python-GIS分析之地理数据空间聚类

地理空间数据聚类是空间分析和地理信息系统(GIS)领域的一项关键技术。这种方法对于理解地理数据固有的空间模式和结构、促进城市规划、环境管理、交通和公共卫生等各个领域的决策过程至关重要。本文探讨了地理空间数据聚类的概念、方法、应用、挑战和未来方向。 当模式出现…

cdn尝试(减少打包体积)

如果是vue-cli创造的工程&#xff0c;在build后面加上 --report&#xff0c;就会在dist文件夹下出现report.html用于分析打包后个文件的体积 也可以使用插件&#xff1a; webpack使用webpack-bundle-analyzer进行分析&#xff1b; vite使用rollup-plugin-visualizer进行分析…

QT下跨平台库实现及移植经验分享

最近在移植公司一个QT桌面软件到android上&#xff0c;有一些公司自定义的库&#xff0c;用了很多windows的api&#xff0c;移植过程很是曲折&#xff0c;在此有一些感悟分享一下~ 一.自编写跨平台库 1.有时候为了程序给第三方用需要编译一些qt封装库&#xff0c;并可能跨平台…

Mac上使用M1或M2芯片的设备安装Node.js时遇到一些问题,比如卡顿或性能问题

对于Mac上使用M1或M2芯片的设备可能会遇到在安装Node.js时遇到一些问题&#xff0c;比如卡顿或性能问题。这可能是因为某些软件包或工具在M1或M2芯片上的兼容性不佳。为了解决这个问题&#xff0c;您可以尝试以下方法&#xff1a; 1. 使用Rosetta模式 对于一些尚未适配M1或M2…

Python 蜂窝六边形分析

在本文中,我们将使用 Wildland Fire Interagency Geospatial Services (WFIGS) 2022 数据集,并仅关注新墨西哥州的 Hermits Peak / Calf Canyon 火灾。这场野火是该州历史上规模最大的野火,烧毁面积超过 30 万英亩。大火位于陶斯和圣达菲之间,烧毁了桑格雷德克里斯托山脉的…