给定一个输入文件,包含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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java集合汇总篇「建议收藏」

    Java集合汇总篇「建议收藏」一.集合框架Java集合框架一些列的接口和类来实现很多常见的数据结构和算法,例如LinkedList就是集合框架提供的实现了双向链表的数据结构,关于这一篇文章建议大家收藏,我会不断地完善和扩充它的内容,例如最下面的系列文章我以后也会对它进行不断的更新集合框架的接口集合框架提供了很多接口,这些接口都包含了特定的方法来实现对集合上的特定操作)我们将要学习这些接口以及子接口和它们的各种实现类,在开始之前我们先简单学习一下这些广泛运用的接口,可以看到整个集合框架,总共有三个顶级接口Collecti

    2022年7月16日
    15
  • 怎么创建web项目_vs怎么创建项目

    怎么创建web项目_vs怎么创建项目进入WTM官网:WTM–Rapiddevelopmentframeworkbasedondotnetcore进入项目创建向导:mysql字符串:server=localhost;database=library;user=user;password=password项目结构如下:使用vs2022打开:直接运行项目:等待编译和前端依赖下载完成即可。注意:需要在本机安装nodejs环境。主页…

    2022年10月22日
    0
  • webservice优缺点以及使用框架_web前端主流框架有哪些

    webservice优缺点以及使用框架_web前端主流框架有哪些原文:https://www.cnblogs.com/firstdream/p/5575928.html1摘要 开发webservice应用程序中离不开框架的支持,当open-open网站列举的就有很多种,这对于开发者如何选择带来一定的疑惑。性能Webservice的关键要素,不同的框架性能上存在较大差异,而当前在官方网站、网络资料中可以方便的找到各自框架的介绍,但是很少有针对不同框架性能测试数据…

    2022年9月16日
    0
  • linux的traceroute命令详解[通俗易懂]

    linux的traceroute命令详解[通俗易懂]traceroute命令详解traceroute[-46dFITUnrAV][-ffirst_ttl][-ggate,…]       [-idevice][-mmax_ttl][-pport][-ssrc_addr]       [-qnqueries][-Nsqueries][-ttos]       [-lflow_label][-wwait…

    2022年10月28日
    0
  • tcpdump抓包命令详解_tcpdump抓udp包命令详解

    tcpdump抓包命令详解_tcpdump抓udp包命令详解linux抓包-tcpdump命令:enp4s0f0—ifconfig—>网卡名称-s0—->不限制抓包的大小port25228—->只抓取服务器上25228端口的数据流量-whk2.pcap—>保存的文件名称-v—>显示抓包的大小数字

    2022年8月20日
    5
  • CLion 2021.3.x激活码(已测有效)

    CLion 2021.3.x激活码(已测有效),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    169

发表回复

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

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