Chapter 1. The Role of Algorithms in Computing 没什么好说的,一些概览性的语言,自己看即可。
Chapter 2. Getting Started.
要点:Insertion-Sort, Merge-Sort, Analyzing algorithms, Loop invariant. (插入排序,合并排序,算法分析,循环不变量)
- Insertion-Sort.
插入排序的正确性用 loop invariant 证明(见下)。其运行时间与具体输入数据相关,Best-case Θ(n),Worst-case Θ(n^2),Average-case Θ(n^2)。CODE
- Merge-Sort.
合并排序的正确性同样可以用 loop invariant 证明。其运行时间 Θ(n*lgn)。 CODE
- Analyzing algorithms
本书中算法分析的模型基于 one-processor, random-access machine 并且不考虑 memory hierarchy (缓存结构)。
原文给出了详尽的 Insertion-Sort 运行时间分析,其运行时间与具体输入数据相关,Best-case Θ(n),Worst-case Θ(n^2),Average-case Θ(n^2)。
这里需要注意,有时候我们之所以只注重Worst-case,原因有三:1)最差情况通常提供运行时间上线、2)有些算法最差情况发生概率大、3)平均与最差情况等价。(这里需要用到后面 Growth of Functions 的知识)
对于 Merge-Sort,提到了 Divide-and-Conquer (分而治之) 的思想,并且对于其运行时间的分析,用到了 recurrence (递归表达式) 和 recursion tree (递归树) 方法。最终得到合并排序运行时间 Θ(n*lgn)。
- Loop invariant.
凡是在程序循环过程中保持不变的量都可以称为循环不变量,但有意义的不变量是可以用之证明程序正确性的不变量。(Stack Overflow)
选择一个特性,如果其在初始化 (Initialization) 和迭代前后 (Maintenance) 保持特性不变,并且该特性在循环结束处 (Termination) 可以表明算法的正确性,那么算法的正确性也就得到了证明。如原文所述,类似于数学归纳法 (Mathematical Induction)。
那么将其用于前面两个算法的证明也是显而易见的平凡。
杂碎:
- P20. Pseudocode conventions 对于伪代码的约定有助于算法理解。(与或操作是 short circuiting)
- P24. 分析如此简化模型下的算法有时甚至都不简单,需要用到的数学工具有:combinatorics (组合数学), probability theory (概率论), algebraic dexterity (代数)。
- P28. 考虑到运行时间函数中的常数系数以及低次幂项,对于小数据输入,运行时间函数具有较高增长率的算法可能比较低增长率的算法运行快。
- 豆瓣有一个讨论Insertion-Sort Average-case 证明的问题,他的这种证明肯定是没问题的(参考P41 Problem 2-4Inversions),但值得思考的是:
原文该处的证明严谨度如何?今天(9.9)早上思考了一会儿,在豆瓣给出了一个回复。(参考5.2-5 [10.5 更新])