前言
He calculated just as men breathe, as eagles sustain themselves in the air. ----Francois Arago
算法分析
两个主要任务
1.正确性
(不变性
单调性)
2.复杂度。
小知识:因为C++等高级语言的基本指令,均等于常数条RAM的基本指令;在渐进意义下,二者大体相当。
分析的主要方法
迭代:级数求和
递归:递归跟踪 + 地推方程
猜测 + 验证。
分析的具体实例
算数级数
与末项平方同阶: T(n) = 1 + 2 + ... +n = n( n+1)/2 = O(n^2)
幂方级数
比幂次高出一阶
T2(n) = 1^2 + 2^2 + 3^2 + ... + n^2 = n(n+1)(2*n+1)/6 = O(n^3);
T3(n) = 1^3 + 2^3 + 3^3 + ... + n^3 = n^2(n+1)^2/4 = O(n^4);
同理:k^m(k 从1 到 n )之和 的复杂度是 n^(m+1)
几何级数
Ta(n) = a^0+a^1+...a^n = (a^(n+1) - 1 )/(a - 1) = O(a^n)
收敛级数
1/1/2 + 1/2/3 + 1/3/4 + .. + 1/(n-1)/n = 1 - 1/n = O(1);
1+ 1/(2^2) + ... + 1/n^2 < 1 + 1/(2^2) + ... =PI^2/6 =O(1);
(以下可能未必收敛,然而长度有限)
h(n) = 1 + 1/2 + 1/3 + ... + 1 / n = O(log n) //调和级数
log1 + log2 + log3 + ... + log n = log(n!) = O (n * log n) //对数级数