概述
海量数据去重-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 会有碰撞问题,即可能映射到同个位置
- 位图适合对