海量数据查找

来源:互联网 发布:mac intellij idea 卡 编辑:程序博客网 时间:2024/06/05 04:00
有一百万个数,是在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
原创粉丝点击