问题是这样的:如何存储5亿个正整数,并对这些数据进行排重。
直接用一个长度为5亿的int型数组存起来?这显然是不可能的,让我们来计算一下:
一个int型数据占用4byte,5亿个正整数也就是1.6*10^10bit,约为16G,16G的数据全存在内存里,内存显然不够用。那么,如何才能缩小占用空间呢?
再回到问题上看看,问题要求对数据进行排重,在用int存储的情况下,这5亿个数据的范围也就是0-2^31,排重的结果不过就是0到2^31的每一个数值都最多只有一个数存在。约定用1表示有这个数,0表示没有这个数,如此一来就可以用一个bit来表示一个数了。
解决方法如下:建立一个长度为2^28的byte型数组,数组中每一个byte每一位的1或0就代表了数据的存在与否。
在这个题目中,可以认为,我们是从数据流中接收到5亿个数据的。每收到一个数据,就判断它在byte数组中是否存在,若不存在,这把代表这个数据的那一位由0改为1。
代码如下:
//创建一个长度为2^28的byte数组
byte bytes[] = new byte[(int)Math.pow(2, 28)];
int i;//表示数组的第几位
int j;//表示一个byte数据的第几位
int b;//bytes[i]无符号转化后的int数值
int a;//bytes[i]的第j为数值
/**
* 保存出输入流中读到的数据
* @param x 从输入流中获得的正整数
*/
public void paichong(int x){
i = x/8;//一个byte可以存8个数
j = x%8;
this.isExist(x);//判断该数是否已经出现过
if(a==0){//若没有出现过,这把这一位改为1
if(j==7){//若为最高为,直接加2^7最高会变成1,但是其他位也会发生变化
bytes[i] -= 2*bytes[i];
}else bytes[i] += (int)Math.pow(2, j);
}
}
/**
* 判断x是否曾经出现过
* @param x
*/
private void isExist(int x) {
b = bytes[i];
if(bytes[i]<0){
b = (int)(-bytes[i])+128;
}else b = bytes[i];
//类似四位数的位数获得方法
a = b/(int)Math.pow(2, j)%(int)Math.pow(2, 7-j);
}
}
- 大小: 4.4 KB
分享到:
相关推荐
1016:整型数据类型存储空间大小 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 34014 通过数: 23679 【题目描述】 分别定义int,short类型的变量各一个,并依次输出它们的存储空间大小(单位:字节)。 【输入】 ...
1017:浮点型数据类型存储空间大小 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 27763 通过数: 22417 【题目描述】 分别定义float,double类型的变量各一个,并依次输出它们的存储空间大小(单位:字节)。 ...
### Weblogic内存大小配置与调优 在IT领域,尤其是企业级应用服务器的运维与管理中,Weblogic作为一款广泛使用的中间件平台,其性能优化是确保应用稳定性和响应速度的关键。其中,合理配置Weblogic的内存大小是优化...
在处理自定义数据类型时,了解变量占用的内存大小是非常重要的,这有助于优化内存管理和防止内存溢出。 结合提供的压缩包文件"易语言内存自定义数据类型源码",我们可以期待学习到如何在易语言中定义、创建、使用和...
本篇文章将深入探讨易语言中的自定义数据类型、如何获取其大小以及与内存管理相关的知识点。 首先,我们需要了解易语言中的数据类型。易语言提供了多种内置的数据类型,如整型、实型、字符型、逻辑型等。此外,为了...
在内存中,自定义数据类型会按照定义的顺序和大小依次分配空间,这种存储方式称为“结构化存储”。 在创建自定义数据类型时,易语言会为每个成员分配相应的内存空间,并根据成员的类型和顺序来决定整个数据类型的总...
在编程中,了解一个数据类型所占的内存大小是一个基础而重要的知识点。通常我们使用C语言中的sizeof运算符来获取数据类型或者变量所占用的字节。但是在某些特定的情况下,比如笔试题目中提到的,可能需要我们不依赖...
本篇文章将围绕“通过Key前缀分析Redis的内存占用并按内存大小排序导出结果到csv文件”这一主题,详细介绍相关的技术知识点。 首先,我们需要理解Redis的内存管理。Redis中每个键值对都有一个内存开销,包括键的...
本文将围绕“设置Tomcat启动内存大小”这一主题,深入探讨如何通过修改配置文件来调整Tomcat服务器的内存使用,以满足不同应用场景的需求。 ### Tomcat内存参数详解 在描述中提到的`catalina.sh`脚本中的`JAVA_...
#### 二、预设存储内存和程序内存大小 1. **配置bib文件中的FSRAM百分比** - 在Project Builder (PB)中,可以通过修改`config.bib`文件来调整存储内存和程序内存的比例。 - 具体操作是在`config.bib`文件中找到`...
Android获取储存信息以及内存信息可以用adb命令查看。... * 获取手机内存总大小 * @return */ public static String getTotalMemorySize() { try { FileReader fr = new FileReader(FILENAME_PROC_ME
- 调整相关参数:如`dfs.datanode.max.locked.memory`来控制DataNode可以锁定的内存大小,确保不超过系统允许的内存锁限制。 二、“冷热温”存储策略 “冷热温”存储是根据数据访问频率和价值划分的不同存储级别。...
这主要是因为phpExcel在内存中保存单元格信息,当数据量大时,内存消耗超过PHP配置的最大值,导致错误。下面将详细探讨如何解决phpExcel导出大量数据时出现的内存溢出问题。 首先,需要了解phpExcel在内存使用上的...
总结起来,Java对象的内存大小计算涉及对象头、实例数据和对齐填充的综合考虑。通过`Unsafe`类或`Instrumentation`接口,我们可以获取这些组成部分的具体大小,进而了解一个Java对象在内存中的占用情况。这样的知识...
在这个数字化时代,内存卡被广泛用于手机、相机、无人机等设备,存储着照片、视频、文档等各种类型的数据。一旦这些数据意外丢失,可能是因为误删除、格式化或者其他原因,数据恢复工具就显得尤为关键。 首先,我们...
在UEFI(统一可扩展固件接口)shell环境下,读取内存存储的数据信息是一项重要的系统诊断和调试任务。UEFI shell提供了一个用户友好的命令行界面,允许开发者和系统管理员直接与固件交互,执行各种操作,包括内存访问...
即使文件大于可用物理内存,操作系统也会根据需要按需加载和交换页面,使得程序可以处理远大于实际内存大小的文件,而不需要一次性全部加载到内存。 5. **并发访问控制**: 当多个进程同时访问内存映射文件时,...
在Java编程语言中,了解对象内存大小是优化内存使用、提高程序性能的关键步骤。当我们谈论“Java对象内存大小”时,我们通常指的是一个Java对象在内存中占据的空间,包括对象头、实例字段以及可能的对齐填充。这个...
内存池是预先在堆上分配的一块连续内存区域,通过内部的数据结构(如链表或位图)来管理这些内存块,以便按需分配和释放固定大小的内存。内存池的主要优点包括减少内存碎片、提高内存分配速度和便于资源管理。 二、...
Java中的各种数据类型在内存的存储方式 Java中的数据类型可以...堆内存的优点是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。缺点是要在运行时动态分配内存,存取速度较慢。