编程珠玑笔记~排序10^7个数
2016-01-05 22:53
295 查看
题目要求:
对小于10000000的n个存在文件中的整数排序,要求:每个整数最多出现一次,
1MB可用内存,时间至多几分钟,运行时间10s左右最好。
Solution:
*方法一、1MB/4B=262144个整数,若要用文件排序大约40个通道,读文件40次,我们知道
*相对于内存操作,读磁盘的操作是相当慢的。
*方法二、用字符串存储每一个整数(一个数7个字节),对字符串排序,但是还是要读大于
*40次的磁盘。
*方法三、用第i个数表示i,整型数组,每一个占4B,1MB/4B=262144个数,不足表示1千万
*个数,char数组1MB/1B=1048576个数,不足表示1千万个数,1MB*8=8Mb=8388606,用位表示
*大约表示800万个数,依然不够,但是我们注意到对1000万个数最多分两次排序即可。
*第一个排序0~5000000的数,第二次排序5000000~10000000。
对小于10000000的n个存在文件中的整数排序,要求:每个整数最多出现一次,
1MB可用内存,时间至多几分钟,运行时间10s左右最好。
Solution:
*方法一、1MB/4B=262144个整数,若要用文件排序大约40个通道,读文件40次,我们知道
*相对于内存操作,读磁盘的操作是相当慢的。
*方法二、用字符串存储每一个整数(一个数7个字节),对字符串排序,但是还是要读大于
*40次的磁盘。
*方法三、用第i个数表示i,整型数组,每一个占4B,1MB/4B=262144个数,不足表示1千万
*个数,char数组1MB/1B=1048576个数,不足表示1千万个数,1MB*8=8Mb=8388606,用位表示
*大约表示800万个数,依然不够,但是我们注意到对1000万个数最多分两次排序即可。
*第一个排序0~5000000的数,第二次排序5000000~10000000。
/** *Author: xiaoran *Time: 2016/01/05 21:25 ****************** *problem:对小于10000000的n个存在文件中的整数排序,要求:每个整数最多出现一次, *1MB可用内存,时间至多几分钟,10s左右最好 *Solution: *方法一、1MB/4B=262144个整数,若要用文件排序大约40个通道,读文件40次,我们知道 *相对于内存操作,读磁盘的操作是相当慢的。 *方法二、用字符串存储每一个整数(一个数7个字节),对字符串排序,但是还是要读大于 *40次的磁盘。 *方法三、用第i个数表示i,整型数组,每一个占4B,1MB/4B=262144个数,不足表示1千万 *个数,char数组1MB/1B=1048576个数,不足表示1千万个数,1MB*8=8Mb=8388606,用位表示 *大约表示800万个数,依然不够,但是我们注意到对1000万个数最多分两次排序即可。 *第一个排序0~5000000的数,第二次排序5000000~10000000。 */ #include<cstdio> #include<iostream> #include<fstream> #include<bitset> #include<ctime> using namespace std; const int MAX=5000000; int main() { time_t t1=clock(); //freopen("outputran.txt","r",stdin); //freopen("outputran1.txt","w",stdout); FILE *fp_in = fopen("outputran.txt", "r"); FILE *fp_out = fopen("sort.txt", "w"); bitset<MAX> bit; int a; while(fscanf(fp_in,"%d",&a)!=EOF){ if(a<=MAX) bit.set(a, 1); } for(int i=0;i<=MAX;i++){ if(bit[i]) fprintf(fp_out,"%d ",i); } fseek(fp_out, 0, SEEK_SET); bit.reset(); while(fscanf(fp_in,"%d",&a)!=EOF){ if(a>MAX){ bit.set(a-MAX, 1); } } for(int i=0;i<=MAX;i++){ if(bit[i]) fprintf(fp_out,"%d ",i+MAX); } time_t t2=clock(); printf("\n%d ",(t2-t1)%1000000); return 0; }
相关文章推荐
- c++学习随笔(基本概念篇)
- 自学java hibernate简单使用
- java 将list按指定大小等分,最后多余的单独一份
- 基于ATmega16单片机 波形发生器 程序源代码
- C 语言学习 —— 《明解C语言》
- Java笔记——IO流分类
- 深入java虚拟机(四)
- Eclipse中Android工程下布局文件无法正常预览
- python知识-python操作MySQL数据库
- 单例模式 c#
- 删除重复节点
- C#静态变量、静态方法、静态类
- PYTHON 奇怪现象 记录下 WindowsError: [Error 2]
- C#中如何判断一个文件是否存在
- 第六章(函数)编程题一
- 自学java SessionFactory的创建
- 基于ATmega16单片机 程控滤波器程序源代码
- 二、Python-----用户交互
- python 装饰器
- C++11新特性应用--实现延时求值(std::function和std::bind)