Programming Pearls 笔记(1)
COLUMU 1: CRACKING THE OYSTER
(原版的英文,读起来确实费劲。。不过要坚持。。。。。我就写写大致内容,参考参考其他中文版)
问题描述:
输入:小于n=107的正整数(positive integers),不重复出现,没有其他相关联的信息。
输出:按照从大到小的顺序排列
约束条件(constraints):1Mb(megabyte)的主内存空间,充足的硬盘存储。运行时间最多几分钟,最好10s,( a run time of ten seconds need not be decreased)
程序设计:
这里谈到两个解决方案
1)归并排序(Merge Sort),会产生大量中间文件(work files)
2)将每个整数看作是32位整数,1MB就可以存储大约 250000个整数,然后对文件,40次读取input files内容,利用快排(Quicksort:A Quicksort would be quite efficient for the main-memory sorts.).这样就没有中间文件了,但是要多次读写input files.
实现方案:
就开始特定的问题而言,由于都是整数,我们考虑用这样的存储方式来存储数据。
例如{1,2,3,5,8,13}我们可以用这样的字符串来存储:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0
即,对于整数n,就在第n位上写1。
对于排序的实现:伪代码如下
1 //phase 1: initialize set to empty
2 for i = [0,n)
3 bit[i] = 0
4 //phase 2: insert present elements into the set
5 for each i in the input file
6 bit[i] = 1
7 //phase 3: write sorted output
8 for i = [0,n)
9 if bit[i] == 1
10 write i on the output file
(ps:对于我个人来讲:我很好奇怎么样去开107这样大的数组?亦或是这么长的字符串?这个不是重点。。。。也是我个人知识有限)
这样的作法,相比上面的两种方案来讲,实现了,对input file 一次读入,不产生中间文件,效率很高的实现了排序。
最后一项
原则(Principles)
正确的问题(the right broblems)
如果你能正确的定义问题,将会事半功倍。解决问题前,要仔细思考,对我们学生而言就是审题。显然上面的解法,仅仅针对于特定的排序有效 :1.正整数 2.不重复 3.没有 关联信息。
Bitmap的数据结构
这也是一种有效的组织数据结构的方法,如果不满足那三个条件,可以做出一些修改,表项上面要复杂些。
Multiple-Pass Algorithms
A time-Space Tradeoff and One That Isn't。 时间空间的转换,不可偏废
A simple Design 程序设计应该尽可能简单。简单的程序总比复杂的程序要健壮、高校。
个人水平有限,对内容的理解就到此。。很多不明白的地方,以后再补充吧。。