题目
给定一个输入文件,包含40亿的非负整数,请设计一种算法,产生一个不在该文件中的整数。假设你有1GB内存来完成这项任务。如果只有10MB内存又该怎么办。假定所有值都是唯一的。[摘自程序员面试金典]
解题思路:一般遇到这种大批量的数据需要处理时,我们首先要告诉自己,解决方法肯定不会超出我们平时所学的。我们也可以适当的将题目简化。看着这么大的数据,我们不妨先从简单的做起。正常的,我们查找非负整数中不出现的数,在内存足够的情况下,我们可以定义一个数组,将每个数作为数组下标,出现了,改下标对应的值就加1,否则就为0.然后再来一次遍历就可以解决。这个想法能不能放在该题上呢?
40亿等于2^32次方。有1G的内存,既然所有值都是唯一的,我们完全可以用一个bit位来表示该数是否存在。1G的内存表示的bit位是80亿,明显是满足需要的。这里面我们也可以用BitSet类来解题。
long numofInts=((long)Integer.MAX_VALUE+1);
byte[] bitfield=new byte[(int)(numofInts/8)];
void findNum() throws FileNotFoundException
{
Scanner in=new Scanner(new FileReader("file.txt"));
while(in.has