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 程序设计应该尽可能简单。简单的程序总比复杂的程序要健壮、高校。

 

个人水平有限,对内容的理解就到此。。很多不明白的地方,以后再补充吧。。

 

 

      

posted @ 2012-02-21 15:16  细胞核  阅读(351)  评论(0编辑  收藏  举报