《编程珠玑I》 -- Jon Bentley
《Programming Pearls,编程珠玑》中的每一章节都可以自成体系,但此书的各章节在存在逻辑上的分组。在阅读此书的过程中需要将各章“珍珠”串联起来,以领悟Jon Bentley以此书为载体融入在书中的程序“设计技巧”和“基本设计原则”。
1 第一部分
(1) 第一部分内容
此书第一部分讲述了程序设计的基础知识,在程序设计时应该适当地考虑这些步骤。
- 问题定义:准确的定义现实中的编程问题(准确审题,抽象出问题核心和关键限制条件)。
- 算法:有时看似复杂的问题在别出心裁的分析下可得出很简单的解决方案即算法。
- 数据结构:数据结构是决定算法或者是算法的关键载体。
- 编码:编码时也需要适当的技巧。
- 程序验证和测试:使用“脚手架”测试程序(使用“性监视工具”优化程序)。
算法与数据结构没有绝对的独立关系和优先级,可在问题分析后再在具体算法的指导下设计数据结构,也可以在已经明显的数据结构之上设计出可行的算法。
(2) 第一部分例子
[1] 文件排序(多通道算法)
[2] 查找(不需要排序的二分查找)
[3] 位图数据结构应用
[4] 表单字母表
对于具有固定输出及有几个变化输入的编程来说,可以用“表单生成器”+“程序”实现如Web页面。
表单生成器结构
固定内容匹配模式($1)
程序
read 表单生成器 if 表单生成器内容为固定内容 输出 else 表单生成器内容为匹配模式 if模式1 操作 else模式2 操作 … |
另外,对于特定的数据结构可以用特定的数据结构载体如“超文本”、“数据库”、“电子表格”或“域特定语言”。
[5] 向量的旋转
向量(一维数组例)旋转的算法多样,可以有的算法为:
- 额外空间 + 元素移动。
- 子函数每次旋转一个位置 + 调用子函数多次。
- 依次移动x[2i] -->x[i],移完所有的元素。
- ab -->ab1br -->brb1a-->b1bra,可用递归和迭代实现。
- (arbr)r= ba,这样就可以用原语来实现。
[6] 签名手段
求变位词时其它的方法都显得复杂,采取将单词排序生成签名的方式可以较快的求出所有的变位词,因为对每个单词排序的算法(如快排)很快。2 第二部分
第二部分围绕程序的“效率”展开,这是建立在程序设计的基础之上的内容。当程序的效率变得很重要时(软件中的其它属性同效率一样重要,甚至更为重要),便需要在“编码”、“算法设计”和“数据结构”等阶段凭借对效率(时间和空间,在二者不可兼得时需要权衡)有用的手段来提高程序效率。(1) 第二部分内容
- 能影响效率的设计层次及估算:许多层析都能影响程序效率,在提升程序效率时应该主要在那些层次去改善。在设计程序的时候首先需要估算最坏的情况。
- 算法设计:特定需求下,算法应是最重要要的因素,在设计算法时应该考虑时间复杂度。
- 代码优化:由于计算机语言的特性和程序运行的特性(时间花在少量的代码之上)需要可以对代码进行优化来提升程序的效率。
- 压缩空间:在空间有限的情况下,算法和内存空间兼得或者节约内存空间。
设计层次
- 问题定义:进行软件设计时是否将问题定义复杂了,宏观把控是否合理。
- 系统结构:估算宏观及局部是否能有裕度的满足要求。
- 算法和数据结构:实现目标程序所费时间和空间是否满足要求。不满足要求则修改算法或者修改数据结构和算法。
- 代码优化:适当的代码优化可以提升程序的效率(运行时间)。
- 系统软件:需要用新数据库么,……新操作系统?
- 硬件:换一个更快的处理器和硬件环境。
当程序中大量运行如下代码时,这些代码便会成为耗时的典型:
- 求余运算符。
- 内存分配。
- 递归调用。
- 循环内的判断语句。
代码优化的方法:
- 在进行代码优化的时候在其它的设计层次之上看看是否其它的方法都不可以用了或者代价非凡,否则不要轻易的使用代码优化的方法。
- 使用“性能监视工具”测试出耗时代码区域。
- 尽量遵循代码优化的一些原则。(《编程珠玑》附录4 page179)
3 第三部分
第三部分将第一部分和第二部分涉及的技巧应用到了几个程序中,这样的程序就可以达到“产品”及的程序了。
(1) 第三部分内容
将程序设计技巧和设计原则应用到了“排序”、“抽样”、“查找”、“堆”及“字符串”几个方面,展现了产品级别的程序。4 总结
总结三,四点:
- 虽编程珠玑中在性能章节中强调了部分代码的耗时性,这个前提是这部分代码的运行时间占据比较大的比例而言的,如果只是运行极少数遍,则代码的耗时性几乎可以忽略。都是要根据实际情况来分析和操作,不要读书主义。
- 去编程练习吧,等过了一阵子再来看《编程珠玑》第三遍。
- 《编程珠玑》作者Jon Bentley建议了许多的名著诸如《计算机程序设计艺术》、《算法导论》都是及其经典的吧,里面的讲解是精妙绝伦么,有时间要拜读。。
Note Over。