您的位置:首页 > 编程语言

编程珠玑ch01

2016-04-26 22:59 218 查看

笔记

问题描述:

输入:一个文件,至多包含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.在成本低廉的隔日送达时代之前,商店允许顾客通过电话订购商品,并在几天后上门自取。商店数据库使用客户的电话号码作为其检索的主关键字(客户知道他们的电话号码,并且这些关键字几乎都是唯一的)。你如何组织商店的数据库,以允许高效的插入和检索操作?

根据电话号码的最后两位作为客户的哈希索引,进行分类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程珠玑