编程珠玑感悟<1>
第一章
准确的描述问题
在我们解决一个实际问题的时候,直觉上也许我们觉得将问题抽象化也许会有点大费周章,但是我们若想将
一个问题更精确的考虑,那么将问题抽象化便成为了必不可少的一步,将问题抽象化,实际上是将无关的线
索抛弃,而着手于问题的核心和本质。
抽象化如下:
输入
一个做多包含n个整数的文件,每个数都小于 N ,其中
N=107 .如果在输入文件没有重复的整数。输出
按升序排列输入整数的列表。
- 约束
最多有1MB的内存可用,有充足的磁盘空间可用运行时间最多几分钟,若达到10秒则绝对满足要求。
解决问题
大概有点基础的人都知道用桶排(又称计数排序),但有以下注意点:所有的元素只出现一次,所以在空间大大不够多情况下,我们可以用一个位来表示一个数的有无。
从外部读入数据,不同与我们做题,数据只能读入一遍,在空间不够的情况下,我们可以用时间换空间。
习题
此处摘录了一些很有意思的习题:
1.6.4如何生成 0∼N−1 之间K个随机整数,我想了好几个方法都不是很优美,要么有一定顺序,要么
更依赖于运气,答案给出了极好的解法,他通过将前K个数与 N−1 个数随机交换来解决,swap()展现
了她的魅力,因为无论如何swap(),都不会有一个新的数生成。
1.6.7也许在ACM中绝大部分的输入都是符合一定规范的,但是在实际问题中,这种不规范的输入却是经
常发生,在实际的程序设计中我们要相当注意对数据输入的规范性检查。
1.6.9额,额,我只大致看出这是一个动态初始化的过程,不太看得懂,有看懂的请您不吝赐教了。
1.6.10,11,12 那是一个相当久远的年代了,现在电脑的普及,使得这三个问题解决的太轻松了,不过第十题还是很有启发意义的。
感悟
这一章我们看到了技术排序的威力,当然更重要的是这一章如何将死板的更贴近公式化的算法,灵活的机巧
的应用到解决实际问题中,已知每个数仅仅会出现一次,我们可以压缩计数所用空间的大小,在空间不够的
情况下,如何用时间换取空间,而这往往是很少有算法书上提到的。
当然作为本书第一章,我感觉更重要的意义在于,作者展现的是在解决问题中,我们分析问题,明确问题的
思路,简单至简的设计思路和一颗追求更简单解决问题的心灵。