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 BitSet(32000);
		for(int i=0;i<array.length;i++){
			int num=array[i];
			int num0=num-1;//Bitser从0开始,数字从1开始

			if(bs.get(num0)){
				System.out.println(num);//打印原值
			}else{
				bs.set(num0);//存入num0
			}
		}
	}

class BitSet{
	int[] bitset;
	public BitSet(int size){
		bitset=new int[size>>5];//除以32
	}

	public boolean get(int pos){
		int wordNumber=pos>>5;//除以32
		int bitNumber=pos&(0x1F);//除以32取余数
		return (bitset[wordNumber]&(1<<bitNumber))!=0;
	}

	public void set(int pos){
		int wordNumber=pos>>5;//除以32
		int bitNumber=pos&(0x1F);//除以32取余数
		bitset[wordNumber]|=(1<<bitNumber);
	}

}

注意:也可参考JAVA内置的BitSet类。

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

时间: 2024-11-06 16:16:44

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

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

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

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

【C语言】用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息

//用结构体数组指针完成:有三个学生信息,存放在结构体数组中,要求输出全部信息 #include <stdio.h> struct Stu { int num; char name[20]; char sex; int age; }; int main() { struct Stu student[3]={{317,"han",'m',20},{318,"hun",'w',22},{311,"dan",'w',18}}; struct

【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). 可方便的保

使用虚方法和多态来改善源代码的扩展性

-多态:(转自CSND) 通过继承,一个类可以用作多种类型:可以用作它自己的类型.任何基类型,或者在实现接口时用作任何接口类型.这称为多态性.C# 中的每种类型都是多态的.类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object当作基类型. 多态性不仅对派生类很重要,对基类也很重要.任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象.基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面.例如,表示汽车的基类可能包含这样的行为:当考虑的汽

【Java/Android性能优 4】PreloadDataCache支持预取的数据缓存,使用简单,支持多种缓存算法,支持不同网络类型,扩展性强

本文转自:http://www.trinea.cn/android/preloaddatacache/ 本文主要介绍一个支持自动向前或向后获取新数据的缓存的使用及功能.Android图片内存缓存可见ImageCache. 主要特性:(1).使用简单  (2).可自动预取新数据  (3).可选择多种缓存算法(包括FIFO.LIFO.LRU.MRU.LFU.MFU等15种)或自定义缓存算法  (4).省流量性能佳(有且仅有一个线程获取数据)  (5).支持不同类型网络处理  (6)缓存可序列化到本地

转:内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]

内存区划分.内存分配.常量存储区.堆.栈.自由存储区.全局区[C++][内存管理][转载] 一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域.- 程序结束释放4.另外还有一个专门放常量的地方.- 程序结束释放                          

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

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

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