第一部分 基础
第1章 开篇
结构简单、部件很少、易于维护、非常坚固。
正确的问题,位图数据结构,多趟算法,时间-空间折中与双赢,简单的设计,程序设计的阶段。
第2章啊哈,算法
看起来很困难的问题也可以有一个简单的、意想不到的答案
第3章 数据决定程序结构
恰当的数据视图实际上决定了程序的结构
为什么程序员非要编写大程序呢?一个原因是他们缺少在2.5节中提到的重要的惰性。他们急于完成其最初的想法。在前面描述的两个问题中,有更深层次的原因:程序员在考虑问题时受到了语言的限制。
概念壁垒
能用小程序实现的,就不要编写大程序
程序员在节省空间方面无计可施时,将自己从代码中解脱出来,退回起点并集中心力研究数据,常常能有奇效。(数据的)表示形式是程序设计的根本。
第4章 编写正确的程序
二分搜索的挑战
提供充足的时间,竟然约有10%的专业程序员能够将这个小程序编写正确。
第5章 编程小事
程序员都是乐观主义者,他们总是试图走捷径:编写函数代码,并将其插入到系统中,然后热切地期望它能运行。
5行语句的C语言脚手架就可以完成该工作。
断言的艺术
在测试是使用断言,而在产品发布时将断言关闭的程序员,就像是在岸上操练时穿着救生衣,而下海时将救生衣脱下的水手。
最好的脚手架通常是最容易构建的脚手架。
无论系统的行为乍看起来多么神秘莫测,其背后总有合乎逻辑的解释。
IBM站着可以登录系统而坐着不能登录系统的轶事。有两个键的键帽被换了位置
第二部分 性能
一个简单而又功能强大的程序,令用户欣喜又不令开发者烦恼,这正是程序员的终极目标。
第6章 程序性能分析
算法和数据结构
算法调优
数据结构重组
代码调优
硬件
上面描述的所有改进累积起来就得到了总的加速系数400.
良好的问题定义可以避免用户对问题需求的过高估计。
计算机系统中最廉价、最快速且最可靠的无件是根本不存在的。
简单设计的重要性怎么强调都不过分。
第7章 粗略估算
粗略估算在工程院校中是标准课程,对多数从业工程师来说则是谋生的必备技能。
两个答案比一个答案好
快速检验
经验法则
实践
安全系数
Little定律队列中物体的平均数量为进入速率与平均停留时间的乘积
在进行粗略估算的时候,要切记爱因斯坦的名言:任何事都应尽量简单,但不宜过于简单。
第8章 算法设计技术
复杂深奥的算法有时可以极大地提高程序性能。
要解决规模为n的问题,可递归地解决两个规模近似为n/2的子问题,然后对它们的答案进行合并以得到整个问题的答案。
合适的算法设计可以极大地减少运行时间。
第9章 代码调优
由于太在乎细小的“优化”,他们编写出的程序过于精妙,难以维护。
代码调优的最重要的原理就是尽量少用它——效率的角色,度量工具,设计层面,双刃剑
第10章 节省空间
简单性可以衍生出功能性、健壮性以及速度和空间。
简单性还可以减少代码长度。
在真实系统中,快速的查找时间非常关键,一方面是为了满足用户交互的需求,另一方面是因为其他函数需要通过同一个界面来查找点。
不存储,重新计算。稀疏数据结构。数据压缩。分配策略。垃圾回收。
第三部分 应用
第11章 排序
使用库排序函数
快速排序接近最优算法
第12章 取样问题
小的计算机程序往往能够寓教于乐。
打破概念壁垒
正确理解所遇到的问题,提炼出抽象问题,考虑尽可能多的解法,实现一种解决方案,回顾。
第13章 搜索
库的作用。空间的重要性。代码调优方法。
第14章 堆
用堆来解决 排序 优先级队列
每个数据结构都可以从两方面来看,从外部来看,它的规范说明了它做什么——队列通过通过insert和extract操作来维护元素序列。从内部来看,它的实现说明了它如何做。
优先级队列的堆实现了两种顺序结构之间折中方案。
原理:正确性、抽象性、过程抽象、高效性、抽象数据类型。
第15章 字符串
如何生成随机文本?一种比较经典的方法是让一只可怜的猴子在旧打字机上敲击。
附录D 代码调优法则
空间换时间法则
时间换空间法则
循环法则
逻辑法则
过程法则
表达式法则