当前位置:   article > 正文

腾讯面试题----判断一个数是否存在(大数据方面)_给40亿个不重复的无符号整数,没排过序,如何快速判断一个数是否在这40亿个数中?

给40亿个不重复的无符号整数,没排过序,如何快速判断一个数是否在这40亿个数中?

具体题目要求:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。 

思路:(1)用一个无符号整数表示一个无符号整数时,40亿个无符号整数要全部加载到内存,大概需要16G的内存。

          (2)如果用一个字节表示一个数,大概需要4G内存。

          (3)如果用一位表示一个数是否存在,大概需要500MB。

          (4)假设我们只有250MB内存时,需要把文件切分,分开加载。

这次我用的方法是位图来判断这个数是否存在。

位图:位图是一个数组的每一个数据的每一个二进制位表示一个数据,1代表存在,0代表不存在。

  1. <span style="font-size:24px;">#include<vector>
  2. class BitSet
  3. {
  4. public:
  5. BitSet(const size_t& range)
  6. {
  7. _bitset.resize(range>>5+1); //>>5相当于除以32,得到需要多大内存空间
  8. //(range>>3+1) range为char
  9. }
  10. //0变为1
  11. void Set(const size_t& x)
  12. {
  13. size_t index=x>>5; //得到x在第几个size_t
  14. size_t num=x%32; //在得到x在第几位
  15. _bitset[index]|=(1<<num); //0或1为1
  16. }
  17. //1变为0
  18. void ReSet(const size_t& x)
  19. {
  20. size_t index=x>>5; //得到x在第几个size_t
  21. size_t num=x%32; //在得到x在第几位
  22. _bitset[index]&=(~(1<<num)); //0与1为0
  23. }
  24. //判断是0,返回false,1返回true
  25. bool Test(const size_t& x)
  26. {
  27. size_t index=x>>5; //得到x在第几个size_t
  28. size_t num=x%32; //在得到x在第几位
  29. return _bitset[index]&(1<<num);//不为0,则返回true
  30. }
  31. private:
  32. vector<size_t> _bitset;
  33. };</span>




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/864078
推荐阅读
相关标签
  

闽ICP备14008679号