40亿个非负整数中找到没出现的数

要求这里的非负整数是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亿的数,只关心在备选范围里数据,填充数组,遍历数组,发现一个未出现的数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值