Bitmap位图大法

Bitmap是一种利用位操作高效处理大量数据的技术,常用于判断元素是否存在、数据去重和快速查找。通过对比,当处理100亿个long类型数据时,直接存储需74.5GB内存,而Bitmap只需0.03GB。虽然存在数据碰撞和间隔稀疏的问题,但可通过布隆过滤器和压缩策略进行优化。Bitmap在实际应用中常被各种插件自适应修改以提高效率。

Bitmap是位图的意思,使用位数字表示数据的状态,可以对大量数据进行快速的查找,统计。

 

面试过程中很多都会涉及到大量数据少量内存来进行判断该元素是否存在?判断某一个ip重复次数最多,进行排序找出前100的数据等问题

其实这一类问题用位图可以解决,还有的方法就是读取部分后写入,其实所有的方法都有点分而治之的思想。但是今天不讲分治法,只讲Bitmap思想和遇到问题怎么解决。

 

原理:

什么是bit,一个字节=8bit,使用二进制表示,一个字节能表示的范围为:

 

0000 0000 ~  1111 1111(即0~255)

由于java中有实现了Bitmap的BitSet,里面存储使用的是long类型的数据那么后面的计算就按照long类型计算。

long类型占 8位,1<< 6 = 64位

 

比较:

假设有100亿个long类型数据使用直接存入内存会占用多大的空间呢?

100亿*8/1024/1024/1024 = 74.5G左右

 

使用Bitmap呢?

100亿/256/1024/1024/1024 = 0.03G左右

很明显Bitmap优势,

 

有数据 1,267,299,999这几个数存放位置?

1存在在第一个元素 下标为0 (表示0~255)

267,299存在第二元素中 下标为1 (表示256~511)

999 存在第四个元素 下标为3  (表示768~1023)

 

数组长度为4就可以表示到0到1023,就是通过进制来表示元素的位置,所以二进制都是简单的0和1,所以Bitmap也是有局限的,可以用来排序,去重,和快速查找元素。

 

 

问题:

Bitmap其实使用的过程中还是会出现问题的

1、数据碰撞,主要是字符串的映射到Bitmap的时候会有问题,使用布隆过滤器,使用多个hash函数来减少冲突。

2、数据间隔稀疏, 解决问题就使用压缩的Bitmap,可以减少内存开销

 

Bitmap很多插件都会采用它的原理方式,但是都会进行自适应的修改,因为适合自己的才是最好的不是。

 

                                                 文章同时会更新到公众号,觉得对你有帮助或者有用的可以关注一下哦 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值