编程珠玑感悟<1>

来源:互联网 发布:dwg软件 编辑:程序博客网 时间:2024/05/18 13:27

编程珠玑感悟<1>

    • 编程珠玑感悟1
      • 第一章
        • 准确的描述问题
        • 解决问题
        • 习题
        • 感悟

第一章

准确的描述问题

在我们解决一个实际问题的时候,直觉上也许我们觉得将问题抽象化也许会有点大费周章,但是我们若想将

一个问题更精确的考虑,那么将问题抽象化便成为了必不可少的一步,将问题抽象化,实际上是将无关的线

索抛弃,而着手于问题的核心和本质。

抽象化如下:

  • 输入

    一个做多包含n个整数的文件,每个数都小于N,其中N=107.如果在输入文件没有重复的整数。

  • 输出

    按升序排列输入整数的列表。

  • 约束

    最多有1MB的内存可用,有充足的磁盘空间可用运行时间最多几分钟,若达到10秒则绝对满足要求。


解决问题

大概有点基础的人都知道用桶排(又称计数排序),但有以下注意点:
  • 所有的元素只出现一次,所以在空间大大不够多情况下,我们可以用一个位来表示一个数的有无。

  • 从外部读入数据,不同与我们做题,数据只能读入一遍,在空间不够的情况下,我们可以用时间换空间。


习题

此处摘录了一些很有意思的习题:

  • 1.6.4如何生成0N1之间K个随机整数,我想了好几个方法都不是很优美,要么有一定顺序,要么

    更依赖于运气,答案给出了极好的解法,他通过将前K个数与N1个数随机交换来解决,swap()展现

了她的魅力,因为无论如何swap(),都不会有一个新的数生成。

  • 1.6.7也许在ACM中绝大部分的输入都是符合一定规范的,但是在实际问题中,这种不规范的输入却是经

    常发生,在实际的程序设计中我们要相当注意对数据输入的规范性检查。

  • 1.6.9额,额,我只大致看出这是一个动态初始化的过程,不太看得懂,有看懂的请您不吝赐教了。

  • 1.6.10,11,12 那是一个相当久远的年代了,现在电脑的普及,使得这三个问题解决的太轻松了,不过第十题还是很有启发意义的。


感悟

这一章我们看到了技术排序的威力,当然更重要的是这一章如何将死板的更贴近公式化的算法,灵活的机巧

的应用到解决实际问题中,已知每个数仅仅会出现一次,我们可以压缩计数所用空间的大小,在空间不够的

情况下,如何用时间换取空间,而这往往是很少有算法书上提到的。

当然作为本书第一章,我感觉更重要的意义在于,作者展现的是在解决问题中,我们分析问题,明确问题的

思路,简单至简的设计思路和一颗追求更简单解决问题的心灵。

0 0
原创粉丝点击