题目:
32位无符号的范围是0-42 9496 7295,现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有未出现的数。
初阶:可以使用最多1GB的内存,怎么找到所有未出现过的数
进阶:内存限制为10MB,但是只用到一个没出现过的数即可
思路:
首先明确两个公式:1B = 8bit 32b = 4B
一个数占4B
40亿个数大约16GB空间
简单的办法(初阶) 就是申请一个42 9496 7295的bit array 数组,遍历40亿个数,如在某个数对应位置,则该数组相应位置标记为1,遍历40亿文件之后,再遍历数组,发现哪个位置为0,表示该位置的数未出现过。
此办法所需要空间:42 9496 7295b = 42 9496 7295/8 B 大约500M空间
还有一个办法(进阶)就是根据内存限制10MB=10 000 KB = 10 000 000 B = 80 000 000 b
根据内存限制一下子只能处理大约80000个数,原始42 9496 7295 个数 / 80 000 000 大约等于50多个空间
所以反过来思考总结一下:
1、首先申请一个大于50多个空间的空间(假设申请64个)
2、 一共64个空间,共有42 9496 7295个数,每个空间大概67000000左右个数
遍历42 9496 7295个数 如果数的范围在那个空间,则该空间加1,此步骤所需内存为64*4B
3、选择区间位置没有满的空间,针对该空间遍历42 9496 7295个数只选择落在该空间的数,申请一个67000000左右的数组,如果那个数在对应位置,则该位置变为1,最终遍历该空间找出为0的位置,对应的数即可找到,此步骤所需空间大小为67 000 000b 大约8M