标签:style blog http color 使用 文件
题目:
1、归并排序。你可能会想到把磁盘文件进行归并排序,但题目要求你只有1MB的内存空间可用,所以,归并排序这个方法不行。
2、位图方案。熟悉位图的朋友可能会想到用位图来表示这个文件集合。例如正如编程珠玑一书上所述,用一个20位长的字符串来表示一个所有元素都小于20的简单的非负整数集合,边框用如下字符串来表示集合{1,2,3,5,8,13}:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
上述集合中各数对应的位置则置1,没有对应的数的位置则置0。
说明:使用bitset方法必须满足的条件是:不能有重复的数字
#include <assert.h> #include <bitset> #include <iostream> using namespace std; const int maxEachScan = 5000000; const int maxSortNumber = 10000000; void SortBigNumber() { FILE *fp_unSortFile = fopen("d:\\unSort_data.txt","r+"); FILE *fp_SortFile = fopen("d:\\sort_data.txt", "w+"); assert(fp_unSortFile); bitset<maxEachScan> bit_map; //因为数据比较大,分成两次执行,这里相当于定义了一个数组来保存所有结果 bit_map.reset(); //置0 int num; /*第一遍遍历*/ while (fscanf(fp_unSortFile,"%d",&num)!=EOF) { if (num < maxEachScan) bit_map.set(num, 1); //bitset内部机制,保存在bit_map中 } for (int i = 0; i < maxEachScan; i++) //遍历bit_map { if (bit_map[i] == 1) fprintf(fp_SortFile, "%d", i); //这里就是将数据用bit保存(放在bitmap中),再输出的时候输出其对应的数字 } /*第二遍遍历*/ bit_map.reset(); fseek(fp_unSortFile,0,SEEK_SET); //移到文本的开头 while (fscanf(fp_unSortFile,"%d",&num)!=EOF) { if (num >= maxEachScan&&num < maxSortNumber) bit_map.set(num-maxEachScan, 1); } for (int i = 0; i < maxEachScan; i++) { if (bit_map[i] == 1) fscanf(fp_SortFile,"%d",i+maxEachScan); } fclose(fp_unSortFile); fclose(fp_SortFile); }
// bitset::set #include<iostream>// std::cout #include<bitset>// std::bitset int main () { std::bitset<4> foo; std::cout << foo.set()<<‘\n‘;// 1111 std::cout << foo.set(2,0)<<‘\n‘;// 1011 std::cout << foo.set(2)<<‘\n‘;// 1111 return0; } Edit&Run Output: 1111 1011 1111
如何给10^7个数据量的磁盘文件排序,布布扣,bubuko.com
标签:style blog http color 使用 文件
原文地址:http://www.cnblogs.com/menghuizuotian/p/3840047.html