给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB…

给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB…

大家好,又见面了,我是全栈君。

/**
 * 功能:给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
 * 进阶:内存限制10MB。

 */

 

 

[java] view plain copy

 

  1. /** 
  2.  * 思路: 
  3.  *  
  4.  * 1)创建包含40个亿个比特的位向量。 
  5.  *     位向量(BV,bit vector)其实就是数组,利用整数(或另一种数据类型)数组紧凑地储存布尔值。每个整数可存储一串32比特或布尔值。 
  6.  * 2)将BV的所有元素初始化为0. 
  7.  * 3)扫描文件中的所有数字(num),并调用BV.set(num,1)。 
  8.  * 4)接着,再次从索引0开始扫描BV。 
  9.  * 5)返回第一个值为0的索引。 
  10.  *  
  11.  *  
  12.  * 值的确定: 
  13.  * 1)2^32——>40亿个不同的整数,一个整数4个字节。 
  14.  * 2)2^30字节——>1GB——>2^33bit——>80亿比特位。每一位映射一个不同的整数,可以存储之多80亿个不同的整数。 
  15.  */  
  16. long numberOfInts=((long)Integer.MAX_VALUE)+1;  
  17. byte[] bitfield=new byte[(int) (numberOfInts/8)];  
  18.   
  19. public void findOpenNumber() throws FileNotFoundException{  
  20.     Scanner in=new Scanner(new FileReader(“f:\\file.txt”));  
  21.       
  22.     while(in.hasNext()){  
  23.         int n=in.nextInt();  
  24.         /* 
  25.          *  使用OR操作符设置一个字节的第n位,找出bitfield中相对应的数字。 
  26.          * (例如,10(十进制)将对应于字节数组中索引2的第2位) 
  27.          */  
  28.         bitfield[n/8]=(byte) (1<<(n%8));  
  29.     }  
  30.       
  31.     for(int i=0;i<bitfield.length;i++){  
  32.         for(int j=0;j<8;j++){  
  33.             /* 
  34.              * 取回每个字节的各个比特。当发现某个比特为0时,即找到相对应的值。 
  35.              */  
  36.             if((bitfield[i]&(1<<j))==0){  
  37.                 System.out.println(i*8+j);  
  38.                 return;  
  39.             }  
  40.         }  
  41.     }  
  42. }  

 

 

进阶:10MB

 

[java] view plain copy

 

  1. /** 
  2.  * 思路:对数据集进行两次扫描,就可以找出不在文件中的整数。可以将全部整数划分为同等大小的区块。 
  3.  * 第一次扫描数组:确定每个数组的元素个数。 
  4.  * 第二次扫描位向量:确定该范围内少的数字。 
  5.  *  
  6.  * bitSize::第一次扫描时每个块范围的大小。 
  7.  * blockNum:第一次扫描时块的个数。 
  8.  *  
  9.  * 值的确定: 
  10.  * 1)10MB——>2^23Byte。一个整数4个字节,因此,最多包含2^21个元素的数组。 
  11.  * 2)bitSize=(2^32/blockNum)<=2^21,所以,blockNum>=2^11。 
  12.  * 2^11<=bitSize<=2^26。 
  13.  * 在这些条件下,挑选出越靠中间的值,那么,在任何时候所诉的内存就越少。 
  14.  */  
  15.   
  16. int bitSize=1048576;  
  17. int blockNum=4096;  
  18.   
  19. byte[] bitfield2=new byte[bitSize/8];  
  20. int[] blocks=new int[blockNum];  
  21.   
  22. public void findOpenNumber2() throws FileNotFoundException{  
  23.     Scanner in=new Scanner(new FileReader(“f:\\file.txt”));  
  24.       
  25.     int starting=-1;  
  26.     while(in.hasNext()){  
  27.         int n=in.nextInt();  
  28.         blocks[n/bitfield2.length*8]++;  
  29.     }  
  30.       
  31.     for(int i=0;i<blocks.length;i++){  
  32.         /* 
  33.          * 若小于,则说明该块中至少少了一个数字 
  34.          */  
  35.         if(blocks[i]<bitfield2.length*8){  
  36.             starting=i*bitfield2.length*8;  
  37.             break;  
  38.         }  
  39.     }  
  40.       
  41.     in =new Scanner(new FileReader(“f:\\file.txt”));  
  42.     while(in.hasNext()){  
  43.         int n=in.nextInt();  
  44.         if(n>=starting&&n<starting+bitfield2.length*8){  
  45.             bitfield2[(n-starting)/8]=(byte) (1<<((n-starting)%8));  
  46.         }  
  47.     }  
  48.       
  49.     for(int i=0;i<bitfield2.length;i++){  
  50.         for(int j=0;j<8;j++){  
  51.             /* 
  52.              * 取回每个字节的各个比特。当发现某个比特为0时,即找到相对应的值。 
  53.              */  
  54.             if((bitfield2[i]&(1<<j))==0){  
  55.                 System.out.println(i*8+j+starting);  
  56.                 return;  
  57.             }  
  58.         }  
  59.     }  
  60.       

转载于:https://my.oschina.net/u/2822116/blog/792607

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108766.html原文链接:https://javaforall.net

(0)
上一篇 2022年2月22日 下午6:00
下一篇 2022年2月22日 下午7:00


相关推荐

  • ssd网络结构_SSD的理解

    ssd网络结构_SSD的理解前段时间一直在看 ssd 但是总是不太明白 今天突然明白了 就记录下自己的理解先看下 ssd 的网络结构如下 由于不想画这个结构 就盗了别人的图 非常感谢此作者 SSD 采用 VGG16 作为基础模型 然后在 VGG16 的基础上新增了卷积层来获得更多的特征图以用于检测 可以明显看到 SSD 利用了多尺度的特征图做检测 模型的输入图片大小是 300×300 还可以是 512×512 其与前者网络结构没有差别 只是最后新增

    2026年3月18日
    55
  • 简单说一下MySQL sum(1) count(1) 区别和联系

    简单说一下MySQL sum(1) count(1) 区别和联系

    2020年11月19日
    187
  • urlencode

    urlencode

    2021年9月25日
    66
  • 推荐哪些好用的国外代理服务器?

    推荐哪些好用的国外代理服务器?现在市场上的代理服务器很多,由于它可以隐藏IP地址而受到很多人的追捧,但是代理服务器基本上都是国外的,对于小白来说,如何选择一个好的代理服务器是一个比较头疼的问题,下面介绍一些比较常用的代理服务器软件。MicrosoftProxyServerMicrosoftProxyServer是在组织中引入对Intemet的访问,在每个桌面上都提供了一种简单而安全的方法,其中包括WebProxy服务器、WinsockProxy服务器和SocksProxy服务器。该系统安装简单,充分利用了内部服务器的安全性,并且.

    2022年4月28日
    193
  • 解决github下载慢及–recursive慢的问题(亲测好用)[通俗易懂]

    在gitclone的地址,例如https://github.com/pytorch/pytorch,改为https://gitclone.com/github.com/pytorch/pytorch,也即加上前缀gitclone.com,然后就可以愉快的下载了(亲测有效)。对于子模块,可以先不要在gitclone的时候加上–recursive,等主体部分下载完之后,该文件夹中有个隐藏文件称为:.gitmodules,把子项目中的url地址同样加上gitclone.com前缀,然后利用gits..

    2022年4月12日
    84
  • Flowable实战-Camel使用「建议收藏」

    Flowable实战-Camel使用「建议收藏」本博客将讨论了如何在Flowable6.4.1中安装和使用Camel。希望在阅读此博客后,您将能够设置FlowableTask应用程序,以允许用户运行可以通过Camel路由与其他应用程序集成Flowable。此博客使用FlowableCamel模块中的示例。CamelCamel是一个apache项目,它是为了让Java应用程序之间提供标准化的集成平台。它以组件的形…

    2022年5月21日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号