海量数据查找

有一百万个数,是在1到一亿当中随机取值,找出这一亿个数中没出现的数,要求用最小的时间复杂度。
说下思想就行,我想到的就是遍历,但感觉太复杂了。

方案1:

用位图法
用一亿个bit来标记一个数是否出现。
比如出现了数字1024,那么就把1024位置1。
从1到一亿扫描,没有标记1的就是缺少的数字。
100000000/1024/1024=95.367431640625,不到96MB的内存。
一个int类型占32bit,需要3125000大小的int数组。(3125000*32=100000000

时间复杂度是O(一百万)+O(一亿)。



方案2:
因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;这里我们把40亿个数中的每一个用32位的二进制来表示。假设这40亿个数开始放在一个文件中。

然后将这40亿个数分成两类:

      1.最高位为0
      2.最高位为1
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个>=20亿(这相当于折半了);与要查找的数的最高位比较并接着进入相应的文件再查找。

 再然后把这个文件为又分成两类:
      1.次最高位为0
      2.次最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了); 与要查找的数的次最高位比较并接着进入相应的文件再查找。
 .......
以此类推,就可以找到了,而且时间复杂度为O(logn)。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值