编程珠玑ch01
来源:互联网 发布:sql删除字段不满足 编辑:程序博客网 时间:2024/05/18 15:23
笔记
问题描述:
输入:一个文件,至多包含n个正整数,每个正整数都要小于n,n=
输出:以增序形式输出经过排序的整数列表。
约束:至多只有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.在成本低廉的隔日送达时代之前,商店允许顾客通过电话订购商品,并在几天后上门自取。商店数据库使用客户的电话号码作为其检索的主关键字(客户知道他们的电话号码,并且这些关键字几乎都是唯一的)。你如何组织商店的数据库,以允许高效的插入和检索操作?
根据电话号码的最后两位作为客户的哈希索引,进行分类。
- 编程珠玑ch01
- 《重构极限编程》CH01
- 《编程珠玑》
- 编程珠玑
- 编程珠玑
- 编程珠玑
- 编程珠玑
- 编程珠玑
- 编程珠玑
- 编程珠玑
- 编程珠玑
- 编程珠玑
- CH01 POJO编程模型,轻量级容器
- 编程珠玑(1)
- 编程珠玑(2)
- 编程珠玑开篇
- 《编程珠玑》笔记
- 《编程珠玑》读书笔记
- 作为后台人员你需要知道的CSS基本知识
- CMakeLists.txt杂记
- 传纸条(一)
- UVa--11572 Unique Snowflakes(尺取法)
- 常见加密算法介绍与比较
- 编程珠玑ch01
- 模拟WeChat
- C++作业4
- 输出纸片折痕方向
- C++结构体
- 深入浅出 - Android系统移植与平台开发(八)- Android系统的本地服务
- 提高安卓的编译速度 -- 使用ccache
- Android Studio对比代码的方法
- 浅谈ajax