zoukankan      html  css  js  c++  java
  • 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 程序设计应该尽可能简单。简单的程序总比复杂的程序要健壮、高校。

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

          

  • 相关阅读:
    ConcurrentHashMap源码阅读
    java中Scanner类nextLine()和next()的区别和使用方法
    setuid
    lsattr
    设置umask
    touch
    od
    vi 搜索
    nl
    cat 参数
  • 原文地址:https://www.cnblogs.com/xibaohe/p/2361364.html
Copyright © 2011-2022 走看看