BitMap位图

Posted kancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BitMap位图相关的知识,希望对你有一定的参考价值。


BitMap位图算法
https://blog.csdn.net/varyall/article/details/79662029

常见面试题

题1:在2.5亿个整数找出不重复的整数,内存不足以容纳着2.5亿个整数。

方案1:使用2-Bitmap
每个数分配2bit,00表示不存在,01表示出现一次,10表示多次,11无意义。然后遍历修改Bitmap中的对应位,如果是00则变01,01则变10,10则保持不变。遍历修改完后,最后遍历输出对应位是01的整数。

方案2:分治法
先将2.5亿个数划分成 2.5亿/2 个组,每个组里2个整数,再在每个组里去掉重复的整数后进行排序,然后再进行归并,最终便可得到只出现过一次的整数。

总结: 用位图法好。

题2:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

方案1:使用Bitmap
一个bit位代表一个unsigned int值。读入40亿个数,设置相应的bit位。由于2^32=42.9+亿,那么2^32bit才能存下40亿个数,也就需要2^32=4Gb=0.5GB=512M内存。读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示不存在。

方案2:二分法
我们把40亿个数中的每一个数都用32位的二进制来表示,因为它们的二进制中每一位要么是0要么是1,因此可以根据数据的某一位来分,该位为1的在分配在一组,该位为0的分配在另一组。这里的二分法就是采用了这种思想。
已知需要查询的这位数的二进制的每位是0还是1,所以从最高位到最低位,总共需进行31次二分查找(由于是unsigned类型,所以最高那位都为0),时间复杂度为O(logn)。

总结: 用位图法很直接,但占用内存量会大点;利用二分法比较巧妙,不太容易想到。

以上是关于BitMap位图的主要内容,如果未能解决你的问题,请参考以下文章

Android 进阶——性能优化之Bitmap位图内存管理及优化概述

Android 进阶——性能优化之Bitmap位图内存管理及优化概述

BitMap位图

android的canvas如何转换为一张bitmap(位图)

Redis 基础 -- 位图(bitmap)数据结构和 bitmap的常用命令(SETBITGETBITBITCOUNTBITPOSBITOPBITFIELD)

bitmap 合并图片