编程珠玑ch01

来源:互联网 发布:sql删除字段不满足 编辑:程序博客网 时间:2024/05/18 15:23

笔记

问题描述:
输入:一个文件,至多包含n个正整数,每个正整数都要小于n,n=107,如果输入时某一个整数出现了两次,就会产生一个致命的错误。这些整数与其他任何数据都不关联。
输出:以增序形式输出经过排序的整数列表。
约束:至多只有1MB的可用主存;但是可用磁盘空间非常充足。运行时间至多允许几分钟;10秒钟是最适宜的运行时间。
分析:
方案一:
每个数32位,在1MB空间中保存250000个数。对输入文件读40次,第一次读0到249999的数,第二次读250000到499999的数,依次类推。每次对读到内存的数做快速排序,排序之后输出到输出文件。
方案二:
每个数用1个位表示,10000000个数需要10000000bit=1250000Byte=1.19MB,需要分成两段。第一段处理0到4999999的数,第二段处理5000000到999999的数。
将位图初始化为全0。
从输入中读到数n,则将位图中的第n位置为1。
读完一段,将这一段中统计到的数输出到输出文件,需要从位图的第0位到第4999999位遍历。

习题解答

1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?
C++有实现排序的函数:sort,该函数实现快速排序
2.使用位逻辑来实现位向量

class bitmap{public:    bitmap(int length) {        int size=(length+7)>>3;        buf=(char*)malloc(size);        memset(buf, 0, size);    }    void set(int i) {        int ind=i>>3;        int offset=ind & 7;        buf[ind]|=(1<<offset);    }    void clr(int i) {        int ind=i>>3;        int offset=ind & 7;        buf[ind]&=~(1<<offset);    }    bool test(int i) {        int ind=i>>3;        int offset=ind & 7;        return buf[ind]&(1<<offset);    }private:    char *buf;}

4.如何生成位于0到n-1之间的k个不同的随机顺序的随机整数
方法一:

bool *arr=(int*)malloc(sizeof(bool)*n);int *res=(int*)malloc(sizeof(int)*k);memset(arr, 0, n*sizeof(int));for(int i=0; i<k; i++) {    int j=-1;    while(arr[j=rand()%n]);    res[i]=j;    arr[j]=true;}

方法二:

int *arr=(int*)malloc(sizeof(int)*n);int *res=(int*)malloc(sizeof(int)*k);for(int i=0; i<n; i++)    arr[i]=i;for(int i=0; i<n; i++) {    int to=rand()%n;    swap(arr[i], arr[to]);}memcpy(res, arr, sizeof(int)*k);

6.每个整数至多只能出现10次,而不是每个整数至多只能出现1次。
对每个整数,用4个位来表示其在输入文件中的出现次数。
7.使用更多的空间来换取更少的运行时间存在一个问题:初始化空间本身需要消耗大量的时间。说明如何设计一种技术,在第一次访问向量的项时将其初始化为0。你的方案应该使用常量时间进行初始化和向量访问,使用的额外空间应正比于向量大小。因为该方法通过进一步增加空间减少初始化的时间,所以仅在空间很廉价、时间很宝贵且向量很稀疏的情况下考虑。
解决的方法是使用两个外的向量:from和to,还有一个变量top。to是一个栈,top为栈顶,to中保存输入数据的记录,每当输入一个数据,将该数据压入栈中,并将它在栈中的位置存入from中。

if(!(from[i]<top && to[from[i]]==i)) {    from[i]=top;    to[top]=i;    data[i]=0;    top++;    ...}

10.在成本低廉的隔日送达时代之前,商店允许顾客通过电话订购商品,并在几天后上门自取。商店数据库使用客户的电话号码作为其检索的主关键字(客户知道他们的电话号码,并且这些关键字几乎都是唯一的)。你如何组织商店的数据库,以允许高效的插入和检索操作?
根据电话号码的最后两位作为客户的哈希索引,进行分类。

0 0
原创粉丝点击