编程珠玑读书笔记--第一章 海量数据排序问题

来源:互联网 发布:阿里云购买的域名在哪 编辑:程序博客网 时间: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;

}

 

原创粉丝点击