本文参考:Bitmap 算法解释与应用
概念
BitMap 就是用一个 bit 位来标记某个key对应的 value。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间。
使用场景
bitmap排序
假设我们要对5个不重复的数(4,7,2,5,3)排序。
确定最大值是7,数值范围是0~7,共8个数,需要8bit,即1字节。
此时8个字节与集合中的数的对应关系为:
- 00010000 : 4
- 10000000 : 7
- 00000100 : 2
- 00100000 : 5
- 00001000 : 3
所以最终8个bit的结果为10111100,遍历这8bit,所以排序结果为(7,5,4,3,2)。
bitmap排序只有在数据比较密集的时候才会有有其优势,很多情况下并不适用。比如对(1,1000,10万)这种数据集排序就很不合适。
bitmap查找
找出10亿个数字中是否存在某个值
使用bitmap+布隆过滤器,布隆过滤器可以看笔者另一篇文章 布隆过滤器简介
bitmap去重
已知某个文件内包含很多电话号码,每个号码为8个数字,统计不同号码的个数。
8位最多99999999,占用100,000,000个bit,大小为12MB,这样用12M内存就表示来所有8位数的电话。
bitmap查重
10亿个整数中找出不重复的整数的个数,内存空间不足以同时容纳这10亿个整数。
将bitmap扩展一下,用2bit表示一个数即可,0表示未出现,1表示出现一次,2表示出现2次及以上。
在遍历这些数的时候,如果对应位置的值是0,则将其置为1;如果是1,将其置为2;如果是2,则保持不变。