编程珠玑读书笔记--第一章 海量数据排序问题
来源:互联网 发布:阿里云购买的域名在哪 编辑:程序博客网 时间:2024/05/20 11:33
海量数据排序问题:文件包含1千万条电话号码记录(10**7次方),每条记录都是7位整数,没有重复的整数。要求对文件进行排序,注意大约只有1MB的内存空间可用,有充足的磁盘存储空间可用。请设计一个高效的算法。
(1)运用多趟算法:如果每个号码都使用32位整数来表示,则在1MB存储空间里大约可以存250000个号码。因此,可以使用遍历输入文件40趟的程序来完成排序。在第一趟中,将0至249999之间的任何整数读入内在,对其进行排序后写到输出文件中。第二趟遍历250000至499999之间的整数,依此类推,到第40趟遍历的时候对9750000至9999999之间的整数进行排序。
(2)运用位图数据结构:使用一个具有1000万个位的串(约1.25MB)来表示这个文件,其中当且仅当整数i在文件中存在时,第i位为1。首先将所有的位都置为0,从而将集合初始化为空。然后通过读入文件中的每个整数来建立集合,将每个对应的位都置为1。最后扫描每一位,如果该位为1就输出对应的整数,由此产生有序的输出文件。
/*编程珠玑第一章 大量数据排序问题 用位图数据结构来解决
作者:jiangruhua 2011.2.22*/
#include<iostream>
#include<time.h>
#define NUM 10000000
using namespace std;
int a[1+NUM/32];
void set(int i)
{a[i>>5]=a[i>>5]|(1<<(i&0x1F));
}
void clr(int i){
a[i>>5] &= ~(1<<(i & 0x1F));
}
int test(int i)
{
return a[i>>5]&(1<<(i&0x1F));
}
int main(){
time_t begin,end;
int i;
for(i=0;i<NUM;i++)
clr(i);
while(scanf("%d",&i)!=EOF)
set(i);
begin=clock();
for( i=0;i<NUM;i++)
if(test(i))
cout<<i<<endl;
end=clock();
cout<<"runtime"<<double(end-begin)/CLOCKS_PER_SEC<<endl;//用来显示耗时
return 0;
}
- 编程珠玑读书笔记--第一章 海量数据排序问题
- 《编程珠玑》第一章读书笔记
- 《编程珠玑》读书笔记第一章
- 编程珠玑 第一章 大数据排序
- 编程珠玑第一章,电话号码排序问题
- "编程珠玑" 第一章 磁盘文件排序问题
- 第一章 开篇 - 编程珠玑 - 读书笔记
- 《编程珠玑》第一章-位图排序
- 【编程珠玑】第一章电话号码排序
- [编程珠玑读书笔记] 插入排序
- [编程珠玑读书笔记]快速排序
- [编程珠玑读书笔记]第一章代码实现
- 编程珠玑(第二版)读书笔记第一章
- 《编程珠玑》读书笔记——第一章.开篇
- 编程珠玑:位图排序海量整数
- [编程珠玑读书笔记]抽样问题
- 磁盘排序(编程珠玑第一章)
- [编程珠玑]-第一章:位图/位向量排序
- Win 7 上装 WinCE 6.0
- 一位软件工程师的6年总结
- JDBC之Statement,PreparedStatement,CallableStatement的区别
- .NET 程序优化性能的七个方面
- 二元查找树转变成排序的双向链表
- 编程珠玑读书笔记--第一章 海量数据排序问题
- 关于Memcache mutex设计模式的.net实现
- 《Pro Ogre 3D Programming》 读书笔记 之 第八章 渲染对象
- ASP.NET:Form提交中文乱码的解决方法总结
- 由Strust2 session过期引起的问题
- Linux-0.11内核编译问题
- WINCE设置简单的情景模式总结篇~
- compress函数与uncompress函数
- 状态栏、拨号界面、快捷键