码迷,mamicode.com
首页 > 其他好文 > 详细

BitMap位图

时间:2019-03-30 22:48:52      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:时间   查看   占用   如何快速   比较   直接   一个   需要   二分查找   


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位图

标签:时间   查看   占用   如何快速   比较   直接   一个   需要   二分查找   

原文地址:https://www.cnblogs.com/kancy/p/10629518.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!