1.topK问题
题目
10亿int整型数,一台可用内存为1G的机器,时间复杂度要求O(n),统计只出现一次的数。
分析
首先分析需要多大的内存才能表示10亿的数,一个int型占4个字节,10亿就是40亿字节,约等于4GB。如果要完全读入内存的话明显内存不够用。一般思路有两种:
位图法:用一个bit位来标识一个int型整数。
分治法:分批处理这10亿数。
1.1位图法
int型整数是4个字节,即32位,那么把所有int型整数表示出来需要232bit空间,232/8=2^29字节,即512MB。所以利用512MB的空间就可以储存所有的int数。对于这个题目,可以每两个bit表示一个数字,00表示没出现过,01表示出现过一次,11表示出现过多次,比如扫描过程中对于某数字,状态为01则变为11,11则保持不变,那么内存占用1G也是可以满足要求的。
对于1个bit表示一个数字的情况,具体只要申请一个数组int tmp[N/32+1],tmp每个元素占32位,可以表示32个数字,得到BitMap表:
tmp[0]表示0~31
tmp[1]表示32~63
以此类推
假设数据为3,6,8,32,36,则BitMap表如下所示:
img
优点:
(1)运算效率高
(2)占用内存少
缺点:
不可以对重复的数据进行排序和查找。
一般来说BitMap可用于数据查找、去重、排序等操作。
1.对三亿个没有重复的整数进行排序
对于非重复整数排序BitMap有天然优势,只需要扫描一遍,组装成BitMap后,按Bit位输出即可。
2.已知某个文件包含一些电话号码,每个号码为8位数字,统计不同号码的个数
8位最多为99 999 999,即0-99 999 999的数字,统计个数。