数据结构之Bitmap

  • Post author:
  • Post category:其他



目录


一、什么是bitmap


二、bitmap原理


三、bitmap存储空间上的优势,劣势是什么?


四、bitmap的存储空间的优化之RoaringBitmap



一、什么是bitmap

bit即比特,是计算机系统里边数据的最小单位,8个bit即为一个Byte。一个bit的值,要么是0,要么是1。bitmap可以理解为通过一个bit数组来存储特定数据的一种数据结构;


二、bitmap原理

BitMap 的基本原理就是

用一个 bit 来标记某个元素对应的 Value,而 Key 即是该元素


举个例子:

假入你要存一个整数10,那么 在bitmap中存储的时候key 就是10,bitmap的value就是 第10个bit位的标记,1;如下图:

这是一个10bit的数组,从左往右数分别是0,1,2,…10代表10个位置。那刚才的数字来讲,存储在内存中就是这样的,第10个位置上标记1,代表数字 10存在这了,前面的9位是0 代表没有存。如下图:


三、bitmap

存储空间上的优势,劣势是什么?

结论:

bitmap在数据稠密的时候,非常节省空间,但是在数据稀疏的时候,会有极大的浪费

详解:

我们知道一个int型的整型数字存储在内存中是占4个字节(4byte),一个byte是8bit,还是拿上面的例子,存储一个数字 10,用一个int型数组 int[1] 表示的话 就是 1*4*8=32 bit,在内存中占 32bit位,如果是使用 bitmap存呢?32bit 可以存 32个数字,每一个bit位都可以代表一个数字(即可以存储从1,到32,共32个数字),看到了吗?这就是bitmap在存储空间上的优势。

同理这样也会有个劣势,假如bitmap就只是存一个很大的数字 10000, 那怎么表示呢,那就在第10000个bit位上置1其他的bit位还是默认的0,

那么bitmap这时候是占了 10000bit的,而10000这个数字用一个int类型的数组存的话,内存中还是 只占 32bit


四、bitmap的

存储空间的优化之RoaringBitmap

RoaringBitmap 于2016年由S. Chambi、D. Lemire、O. Kaser等人在论文

《Better bitmap performance with Roaring bitmaps》



《Consistently faster and smaller compressed bitmaps with Roaring》

中提出,官网

这里

。这里不详细解释,有兴趣的同学可以看下。

其主要思路是:将32位无符号整数按照高16位分桶,即最多可能有216=65536个桶,论文内称为container。存储数据时,按照数据的高16位找到container(找不到就会新建一个),再将低16位放入container中

图中示出了三个container:

  • 高16位为0000H的container,存储有前1000个62的倍数。
  • 高16位为0001H的container,存储有[216, 216+100)区间内的100个数。
  • 高16位为0002H的container,存储有[2×216, 3×216)区间内的所有偶数,共215个。

  • ArrayContainer

当桶内数据的基数不大于4096时,会采用它来存储,其本质上是一个unsigned short类型的有序数组。数组初始长度为4,随着数据的增多会自动扩容(但最大长度就是4096)。另外还维护有一个计数器,用来实时记录基数。


  • BitmapContainer

当桶内数据的基数大于4096时,会采用它来存储,其本质就是上一节讲过的普通位图,用长度固定为1024的unsigned long型数组表示,亦即位图的大小固定为216位(8KB)。它同样有一个计数器。




版权声明:本文为Tyler93原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。