海量数据去重-BitMap位图解决方案

概述

  海量数据去重-BitMap位图解决方案,需求:一个32位4G内存的操作系统,在20亿个整数中,找出某个数 X 是否存在其中;在 java 语言中,int占4字节,1字节=8位(1 byte = 8 bit)

  • 方案
    • 方式一:每个数字是int类型存储,20亿个int需要的空间大小差不多7GB
    • 方式二:不存储具体数据,而存储是否存在,如果存在则位上存储1,采用bit位存储20亿个数就是20亿位,空间是0.2GB这样

BitMap位图

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

在这里插入图片描述
  对案例方式二说明,每个int类型可标识32个整数,存储20亿个元素需要20亿个比特位,20亿/8/1024/1024 约200MB,省32倍空间

需要申请的数组大小
array[0]:可表示 0-31
array[1]:可表示32-63
array[2]:可表示64-95
...
总的数组长度为 (20亿/32) + 1

arr[0,32] arr[1,32] arr[1,32]
在这里插入图片描述
如何确定位置(给定做生意整数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]
  • 注意
    • 位图适合对 数值类型 的海量数据时行查询统计、排序、去重和对两集合做次、并行运算
    • bitmap在数据连续的时候,是非常节省空间,但是在数据稀疏的时候,会有极大的浪费
    • 字符串映射到 bitmap 会有碰撞问题,即可能映射到同个位置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流月up

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

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

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

打赏作者

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

抵扣说明:

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

余额充值