9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB

/**

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

* 进阶:内存限制10MB。

*/

	/**
	 * 思路:
	 *
	 * 1)创建包含40个亿个比特的位向量。
	 * 	   位向量(BV,bit vector)其实就是数组,利用整数(或另一种数据类型)数组紧凑地储存布尔值。每个整数可存储一串32比特或布尔值。
	 * 2)将BV的所有元素初始化为0.
	 * 3)扫描文件中的所有数字(num),并调用BV.set(num,1)。
	 * 4)接着,再次从索引0开始扫描BV。
	 * 5)返回第一个值为0的索引。
	 *
	 *
	 * 值的确定:
	 * 1)2^32——>40亿个不同的整数,一个整数4个字节。
	 * 2)2^30字节——>1GB——>2^33bit——>80亿比特位。每一位映射一个不同的整数,可以存储之多80亿个不同的整数。
	 */
	long numberOfInts=((long)Integer.MAX_VALUE)+1;
	byte[] bitfield=new byte[(int) (numberOfInts/8)];

	public void findOpenNumber() throws FileNotFoundException{
		Scanner in=new Scanner(new FileReader("f:\\file.txt"));

		while(in.hasNext()){
			int n=in.nextInt();
			/*
			 *  使用OR操作符设置一个字节的第n位,找出bitfield中相对应的数字。
			 * (例如,10(十进制)将对应于字节数组中索引2的第2位)
			 */
			bitfield[n/8]=(byte) (1<<(n%8));
		}

		for(int i=0;i<bitfield.length;i++){
			for(int j=0;j<8;j++){
				/*
				 * 取回每个字节的各个比特。当发现某个比特为0时,即找到相对应的值。
				 */
				if((bitfield[i]&(1<<j))==0){
					System.out.println(i*8+j);
					return;
				}
			}
		}
	}

进阶:10MB

	/**
	 * 思路:对数据集进行两次扫描,就可以找出不在文件中的整数。可以将全部整数划分为同等大小的区块。
	 * 第一次扫描数组:确定每个数组的元素个数。
	 * 第二次扫描位向量:确定该范围内少的数字。
	 *
	 * bitSize::第一次扫描时每个块范围的大小。
	 * blockNum:第一次扫描时块的个数。
	 *
	 * 值的确定:
	 * 1)10MB——>2^23Byte。一个整数4个字节,因此,最多包含2^21个元素的数组。
	 * 2)bitSize=(2^32/blockNum)<=2^21,所以,blockNum>=2^11。
	 * 2^11<=bitSize<=2^26。
	 * 在这些条件下,挑选出越靠中间的值,那么,在任何时候所诉的内存就越少。
	 */

	int bitSize=1048576;
	int blockNum=4096;

	byte[] bitfield2=new byte[bitSize/8];
	int[] blocks=new int[blockNum];

	public void findOpenNumber2() throws FileNotFoundException{
		Scanner in=new Scanner(new FileReader("f:\\file.txt"));

		int starting=-1;
		while(in.hasNext()){
			int n=in.nextInt();
			blocks[n/bitfield2.length*8]++;
		}

		for(int i=0;i<blocks.length;i++){
			/*
			 * 若小于,则说明该块中至少少了一个数字
			 */
			if(blocks[i]<bitfield2.length*8){
				starting=i*bitfield2.length*8;
				break;
			}
		}

		in =new Scanner(new FileReader("f:\\file.txt"));
		while(in.hasNext()){
			int n=in.nextInt();
			if(n>=starting&&n<starting+bitfield2.length*8){
				bitfield2[(n-starting)/8]=(byte) (1<<((n-starting)%8));
			}
		}

		for(int i=0;i<bitfield2.length;i++){
			for(int j=0;j<8;j++){
				/*
				 * 取回每个字节的各个比特。当发现某个比特为0时,即找到相对应的值。
				 */
				if((bitfield2[i]&(1<<j))==0){
					System.out.println(i*8+j+starting);
					return;
				}
			}
		}

	}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 10:06:52

9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB的相关文章

9.10扩展性与存储限制(三)——若只有4KB内存可用,该如何打印数组中所有重复的元素

/** * 功能:给定一个数组,包含1到N的整数,N最大为32000,数组可能含有重复的值,且N的取值不定. * 若只有4KB内存可用,该如何打印数组中所有重复的元素. */ /** * 思路:4KB最多殉职8*4*2^10个比特.比32000大.创建含有32000个比特的位向量,其中每个比特代表一个整数. * 遇到重复元素,打印出来. * @param array */ public static void checkDuplicates(int[] array){ BitSet bs=new

9.10扩展性与存储限制(一)——对于超大型的社交网站,展示两个人之间的“连接关系”或“社交路径”

/** * 功能: /** * 思路: * 1)针对每个朋友ID,找出所在机器的位置:int machine_index=getMachineIDForUser(personID); * 2)转到编号为#machine_index的机器. * 3)在那台机器上,执行:Person friend=getPersonWithID(person_id). * * 定义一个Server类,包含一份所有机器的列表,还有一个Machine类,代表一台单独的机器.通过散列表,有效地查找数据. * */ cla

OpenStack 企业私有云的若干需求(6):大规模扩展性支持

本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云(Hybrid cloud)支持 主流硬件支持.云快速交付 和 SLA 保证 大规模扩展性支持 私有云外围环境支持(包括支持CDN .商业SDN控制器.防火墙和VPN/专线等) 向上扩展性(PaaS 和 SaaS 等支撑) 企业数据中心IT环境支持(包括裸金属/Bare metal.F5 .GPU.跨

服务的扩展性

在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻辑的支持,而非功能性需求则是一系列和业务逻辑无关,却可能影响到产品后续发展的一系列需求.这些需求常常包

服务的扩展性(如何创建具有可扩展性的服务实例,缓存以及数据库)

转自:http://www.cnblogs.com/loveis715/p/5097475.html 在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻

扩展性

服务的扩展性 在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻辑的支持,而非功能性需求则是一系列和业务逻辑无关,却可能影响到产品后续发展的一系列需求.

【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强

本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的使用.功能及网友反馈的常见问题解答. 与Android LruCache相比主要特性:(1). 使用简单  (2). 轻松获取及预取新图片  (3). 包含二级缓存  (4). 可选择多种缓存算法(FIFO.LIFO.LRU.MRU.LFU.MFU等 13种)或自定义缓存算法  (5). 可方便的保

(用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正

原文:(用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正 native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.native_call_qrcode.php这个文件中的代码无法生存native支付的短地址2.WxPayPubHelper.php中某个代码获取不到WxPayConf_pub类定义的常量CURL_TIMEOUT3.WxPayPubHelper.php curl中cURL会话并且异常释放资源4.微信支付长地址

asp.net的10个提升性能或扩展性的秘密(二) 转自网络

简介 Asp.net有很多值得你挖掘的“秘密”,当你发现了它们,将会给你网站的性能和可扩展性带来巨大提升!例如,对于Membership以及Profile提供程序有一些秘密的瓶颈,它们很容易被解决,从而使认证和授权更加快速.另外,asp.net的http管线可以为每一个请求作处理,防止执行了某些不必要的代码而遭受攻击.不只是这些,asp.net工作进程能够突破默认限制,从而完全发挥它的威力.在浏览器端(不是在服务器端)的页面分段输出缓存能显著减少由于请求访问所需要占用的大量下载时间.在需要的用户