博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
大数据计数原理1+0=1这你都不会算(二)
阅读量:7234 次
发布时间:2019-06-29

本文共 718 字,大约阅读时间需要 2 分钟。

上一次我们说完了用 HashSet 来进行计数了。我们可以发现,如果我们估计有N个数,那么我们至少需要N*32bit(按照int在32位操作系统下占用32个bit)的空间来进行存储,这太费钱了。有没有办法进行改进呢?这就引出了一个新的数据结构 - BitMap。

这时候看到一张图代表了一个存储int的字节bit信息。

我们可以发现,每一个bit都有自己的值,比如一个int的空间除了作为int类型的数字外,是否还可以做其他的利用?数字可以表示0~31位置的情况,如果我们使用bit的位置信息来存储会怎样?我们来试试看。

如果我们得到Hash的值为0,那就直接将第0位置上的bit位置为1。

如果我们得到Hash的值为31,那就直接将第31上的bit位置为1。

如果发现位置上已经有值了,那当前的值就已经存在了,不再进行统计,这样子就可以完成超大数据量的统计啦。

这样进行存储的数据结构就叫BitMap,使用每个bit位来进行信息存储,而不是一个int数字。

那有小伙伴就有疑问了,如果超过了32个数字怎么办?

可以使用数组来进行拓展,比如一个a = int[2]的数组。

a[0] 可以表示0~31位,a[1] 可以表示32~63位,以此类推,几乎可以无限大。如果数据确实非常巨大,连下标也到达int的界限了,也可以用其他的单个空间更大的数据类型来进行存储。

相比较于HashSet,BitMap 进行统计所使用的存储只需要 HashSet 的1/32。但是这个数据结构简单,相对于 HashSet 有一点小问题,就是hash在数据量巨大的情况下,碰撞会比较严重,那么统计精度会下降,需要怎么改善呢?

本文作者:大蕉

来源:51CTO

转载地址:http://mjmfm.baihongyu.com/

你可能感兴趣的文章
Absolute Uninstaller是类似于标准的Windows添加/删除卸载工具
查看>>
Linux+shell管理员的好帮手--批量解压缩
查看>>
Windows Server 2008 R2 之十八WDS(部署服务)之二
查看>>
多模块项目的POM重构
查看>>
三、System Center Virtual Machine Manager 2012 添加VMware ESXi 5.0主机
查看>>
MDSF:模型驱动开发(MDD)介绍
查看>>
Oracle-压缩数据
查看>>
XenServer 6.5实战系列之五:XenCenter 6.5
查看>>
PXE方式安装Centos5详解
查看>>
气泡图在开源监控工具中的应用效果
查看>>
让Ubuntu和Android同时运行(Ubuntu on Android)
查看>>
Error 6 initializing SQL*Plus,解决方案:
查看>>
Windows 7保留分区安装系统无法启动、Win7安装XP、VHD启动
查看>>
WINS基本工作原理
查看>>
小玩流媒体播放——HLS流媒体点播系统
查看>>
Office 365系列之十三:Office 365管理员角色
查看>>
烂泥:nginx负载均衡
查看>>
JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言
查看>>
海量运维常用技术之--HAProxy网站负载均衡应用
查看>>
SCCM2012SP1---安装客户端代理软件
查看>>