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

题目:

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值