zoukankan      html  css  js  c++  java
  • 判读40亿数字中是否有某个数字

      网上大部分是使用的bitmap算法。大体思路是:一个字节(Byte) 在计算机中占8位(bit),每个位(bit)可以表示一个数字,1表示含有,0表示不含有。1个32位系统的int类型可以存储2的32次方个bit位,大约是42亿多点。这样40亿需要 40/8=5亿字节,1M =1024KB*1024=1042576Byte,故大概需要512M左右大小即可。空间复杂度是O(n)+O(1);

       

    还有更好的方法:

    这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下:
    又因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;
    这里我们把40亿个数中的每一个用32位的二进制来表示
    假设这40亿个数开始放在一个文件中。

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

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

        并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个>=10亿(这相当于折半了);
        与要查找的数的次最高位比较并接着进入相应的文件再查找。
        .......
        以此类推,就可以找到了,而且时间复杂度为O(logn)
  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/thinkingandworkinghard/p/9545917.html
Copyright © 2011-2022 走看看