编程珠玑第三章探讨

本章陈述了唯物辩证法的重要性,充分体现了经济基础(数据)决定上层建筑(程序结构)。而且也从侧面展示了语言的重要性,书中一位程序员因为语言的问题,不得不使用了350个变量而不是数组。有两个方法让我很在意:一个是打表大法,我们不必要用程序去产生所有数据,某些数据完全可以提前做好,能够节约大笔开发经费(代码量,时间),这就是打表。第二个就是说我们不要重复造轮子,程序员应当善于使用已有的工具。作者给出了本章标题的真正含义:

恰当的数据视图实际上决定了程序的结构

问题探讨

1.使用数组重构后,可以用二分查找优化。

7.这个题目其中一个任务要求实现单词的拼写检查。如果考虑到实现类似Google搜索引擎的那种难度还是相当大的,但是本题目给出了字典的提示,我们可以逆向利用习题2.1的变位词字典。只不过,这回我们要做的是把一个正确拼写的单词顺序打乱,一个简单的递归代码就可以实现,然后做出索引。显然这个笨重的方法不是现代工业界真正使用的,我们不多做讨论(会涉及机器学习,人工智能等领域)。这道题目余下的问题应该都是打表吧。

8.这道题目的编程思想可以用在很多方面,比如说骑士游历问题,提前把骑士可以走的步长写好。第3题也是类似的思路。

1
2
3
4
5
//骑士游历
//(1, 2) (-1, 2) (1, -2) (-1, -2)......

string str[] = {"1011111", "0000101", "1110110", "1110101", "0101101",
"1111001", "1111011", "0010101", "1111111", "1111101"};

摘录

虽然本章中的故事横跨数十年并涉及多种编程语言,但是每个故事的精髓都是一致的:「能用小程序实现,就不要编写大程序」。许多结构都见证了Polya在《How to Solve It》一书中提到的发明家悖论:「更一般性的问题也许更容易解决」。对于程序设计来说,这意味着直接编写解决23种情况的问题很困难;而编写一个处理n种情况的通用程序,再令n=23来得到最终结果,却相对要容易一些。

本章集中讨论了数据结构对软件的一个贡献:将大程序缩减为小程序。数据结构设计还有许多其他正面影响,包括节省时间和空间、提高可移植性和可维护性。……

程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回起点并集中心力研究数据,常常能有奇效。(数据的)表示形式是程序设计的根本。

退回起点思考时的几条原则:

  • 使用数组重新编写重复代码。
  • 封装复杂结构
  • 尽可能使用高级工具。超文本、数据库、编程语言、键-值对、电子表格。
  • 从数据得出程序结构。本章主题就是:通过使用恰当的数据结构来替代复杂的代码,从数据可以得出程序的结构。万变不离其宗:在动手编写代码之前,优秀的程序员会彻底理解输入、输出和中间数据结构,并围绕这些结构创建程序。(有趣的是,第一次让我领悟到这件事的是一位OI神牛,一道提交答案的题目(NP-Complete),他看了数据后发现了规律,用线性的算法针对数据编写了简单的程序。)