要求这里的非负整数是32位也就是0~2^32-1。最多用1GB的内存。如果只能用10MB的空间呢,只需要找到一个没有出现的数即可。
首先先分析一下,40亿个4B约为16GB这里只用1GB,这里要求注意是找出没出现,这就和网页过滤系统类似,出现与不出现两个状态(0和1),那么我们就可以用bit数组来确定。我们用一个长度为2^32的bit数组,内存大小为2^29B为512MB不到一个GB。bit数组下标对应非负整数。数组值表示是否出现。遍历2遍。第一遍根据40亿个数填充bit数组,第二遍根据数组为0的找出没有出现的数。
对于第二个要求的话,只有10MB的空间,那么我们只将512MB的数组
分到只剩不到10MB,那么将0~2^32-1的范围分成64份,则bit数组将只用8MB。再用一个长度为64的int类型数组来记录每一份的数字个数,这64个数中肯定有小于2^26的,找到这个数字段,在创建一个长度为2^26bit数组,遍历40亿的数,只关心在备选范围里数据,填充数组,遍历数组,发现一个未出现的数。