位图BitMap
场景
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。
位图BitMap
位图BitMap:位图是一个数组的每一个数据的每一个二进制位表示一个数据,0表示数据不存在,1表示数据存在。
图中,第一行数值表示一个uint类型(4个字节),136存放在第四个uint类型里,并在该uint类型的第25bit位置上。
BitMap实现代码如下:
1 |
|
假设我们需要查找1000范围内的数值,则需要BitMap bm(1000);
内部的_bits
生成了32个int就可以保存0~1000的值。(一个int,有32个bit,32个int就有1024个bit,每个bit就可以保存一个数值)
解决方法
40亿QQ号码,用位图中的1个bit存储一个QQ号码,那么8个bit等于1个字节,40亿/8/1024/1024=476M,只需要不到512MB就可以存储完40亿QQ号码。
使用上面的BitMap类,使用Set方法,把40亿个QQ号码存到位图中,然后只需要调用Get方法,判断该bit位置的值是否为1就可以知道QQ号码是否存在。
拓展
问题一:用BitMap进行排序
文件中有40亿个互不相同的QQ号码,请设计算法对QQ号码进行排序,内存限制1G.
直接用bitmap存40亿个QQ号码,然后从小到大遍历正整数,当bitmapFlag的值为1时,就输出该值,输出后的正整数序列就是排序后的结果。
问题二:用BitMap求Top-K问题
文件中有40亿个互不相同的QQ号码,求这些QQ号码的top-K,内存限制1G.
除了小顶堆或者文件切割方法外,可以直接用bitmap排序,解决top-K问题。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 胡椒粉的秋天!