Bitmap实现原理&应用场景

本文介绍了Bitmap的数据结构和实现方式,包括使用字符串和数组表示,以及其在处理大量整数去重、电话号码统计、用户标签存储和Bloom过滤器中的应用。重点讲解了如何通过BitMap节省内存并处理特定业务逻辑。
摘要由CSDN通过智能技术生成

Bitmap是什么?

用内存中连续的二进制位(bit),用0或1标识数据是否存在。

长度为10的bitmap,1,2,3,4 在bitmap中存在。

Bitmap实现

1、字符串

    数值对应字符串的下标、二进制位0,1表示是否存在。(01组成的字符串)

    问题:

        非单调递增字符串长度过大。

2、数组

java中 int类型4byte=32 bit,new int[32] 占32*32bit。

用int的每一位标识一个数字,1个int类型可以表示32的数字。

思路:

个int占4字节即4*8=32位,申请一个int数组长度为 int tmp[1+N/32]即可存储数据,

N代表要进行查找的总数,

tmp中的每个元素在内存在占32位可以对应表示十进制数0~31,所以可得到BitMap表:

tmp[0]:可表示0~31

tmp[1]:可表示32~63

tmp[2]可表示64~95

…….

那么接下来就看看十进制数如何转换为对应的bit位:

假设这40亿int数据为:6,3,8,32,36,……,那么具体的BitMap表示为:

如何判断int数字8在tmp数组的哪个下标index?

    通过直接除以32取整数部分-》  8/32=0 -》 tmp[0]

我们如何知道了8在tmp[0]中的32个位中的哪个位?

在tmp[0]中的第 8mod32=8。数字8就在tmp[0]中的第8个bit位(从右边数起)

Bitmap应用场景

1、在3亿个整数中找出不重复的整数,限制内存不足以容纳3亿个整数。

BitMap小小变种:2-BitMap。

为每个整数分配2bit,用不同的0、1组合来标识特殊意思,

00表示此整数没有出现过、01表示出现一次、11表示出现过多次,就可以找出重复的整数了,

需要的内存空间是正常BitMap的2倍,为:3亿*2/8/1024/1024=71.5MB。

具体的过程如下:

扫描着3亿个整数,组BitMap。

查看BitMap中的对应位置,如果00则变成01,是01则变成11,是11则保持不变,

将3亿个整数扫描完之后也就是说整个BitMap已经组装完毕。最后查看BitMap将对应位为11的整数输出即可。

2、已知某个文件内包含一些电话号码,每个号码为8位数字,统计不同号码的个数。

8位最多99 999 999,(可以理解为从0-99 999 999的数字,每个数字对应一个Bit位,所以只需要99M个Bit==1.2MBytes,这样,就用了小小的1.2M左右的内存表示了所有的8位数的电话)

3、用户标签存储

思路:每个标签(eg:程序员) --》bitMap(存的是用户对应的uid)

业务逻辑的处理思路:

and 关系用&运算 、or的关系用 | 运算 、bitMap不支持非运算(如果要求非的情况,通过遍历全量用户然后进行异或操作)

    

4、布隆过滤器 (Bloom Filter) ,它就是专门用来解决这种去重问题的。

描述:Bloom Filter 反馈不存在的值一定不存在、反馈存在值可能不存在。存在一定概率的误判

原理:

(1)通过一系列的hash算法,得到key的hash值。在位数组中标识为1。

(2)判断key是否存在如果所有hash运算反馈的位数组结论都是 1 那么存在。如果有一个反馈是0 说明这个值不存在。

这也说明了为什么布隆过滤器可以精确的知道反馈不存在的值

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码匠心印记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值