题目
现有一个包含40亿个无符号整数(32位,0~4294967295)的文件,找到其中所有未出现过的数
要求
内存限制1GB
思路
可以申请一个长度为4294967295的bitArr,每个位置只可以为0或1。8个bit为1B,所以内存大约要500MB。
遍历40亿个无符号整数,遇到某个数A就将bitArr[A]置为1
遍历完成后,再次遍历bitArr,哪些位置不是1,则哪些数就没出现过
进阶问题
内存限制为10MB,但是只需要找到一个未出现的数即可
思路
将4294967295分成64个区间(由内存限制决定),然后申请一个count[64]用于统计64个区间上每个区间数字的总个数,如出现1,那么1/67108864 = 0; count[0]++
遍历完40亿个数后,肯定有某些区间小于67108864,选定一个这样的区间进行第二次遍历:
- 申请长度为67108864的bitMap,大约需8MB
- 遍历40亿个数,但只关心选定区间的数,把数字对应的bitMap置为1
- 遍历bitMap,某个位置不为1则该位置的数必然没出现过