Bitmap学习笔记-初识bitmap

Bitmap有什么用

大量数据的快速排序、查找、去重

先说说为啥需要用到bitmap

假设有这样一个需求:在20亿个随机整数中找出某个数m是否存在其中

int32占4字节,1字节=8位(1 byte = 8 bit)

如果每个数字用int存储,那就是20亿个int,因而占用的空间约为(2000000000*4/1024/1024/1024)≈7.45 G

如果按位存储就不一样了,20亿个数就是20亿位,占用空间约为 (2000000000/8/1024/1024/1024)≈0.23 G

因此优势很容易能看出来了吧。

bitmap是什么

假如我们要存储 {1,4,6} 这三个数,那我们使用bitmap是如下表示方法:

bitmap的二进制表示

在32位系统中 int占32位,我们只需要申请一个int数组长度为 int tmp[1+N/32] 即可存储,

因为我们可以用如下表示方法

tmp[0]:可以表示 0~31

tmp[1]:可以表示 32~63

tmp[2]:可以表示 64~95

如此一来,给定任意整数M,那么M/32就知道下标,M%32就知道它在此下标的哪个位置

插入

假如我们要在 {1,4,6} 中插入 5 这个数。

插入

5/32 = 0 , 得到数组下标0

5%32 = 5 ,得到插入位置为5。

因此 我们把 1 << 5 得到 0010001,再与原数 0101001 进行或运算,结果得到 0111001

因此总结插入公式为:p + (i/8)|(1<<(i%8)) 其中,p表示现在的值,i表示待插入的数

删除

假设我们要在上面例子 {1,4,6} 中 6移除,该怎么做呢?

刪除

把1左移6位并取反 ~(1<<6) 得到 1011111

再与原数(0101001)进行与运算 得到 0001001 

因此总结删除公式为:p & (~(1<<(i%8))) , p表示现在的值,i表示待插入的数

查找

假设我们要在上面例子 {1,4,6} ,判断3是否存在

总结查询公式为:p & (1<<(i%8)) ,如果结果大于0,则为存在

补充说明

与运算:在二进制中,只有前后两个运算数都是 1 的时候结果才是1

或运算:在二进制中,只有在两个比较的位不同时其结果是1

左移<<,相当于乘以2的n次方,例如:1<<6  相当于1×64=64,3<<4 相当于3×16=48

右移 >> ,相当于除以2的n次方,例如:64>>3 相当于64÷8=8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容