来源:我的博客站 OceanicKang |《C++ 数据结构(一)绪论(4)算法分析》
主要任务
算法分析的两个主要任务 = 正确性(不变性 * 单调性) + 复杂度
C++ 等高级语言的 基本指令,均等效于常数条 RAM 的 基本指令
在渐进意义下,二者大体相当于:
- 分支转向:goto // 算法的灵魂;出于结构化考虑,被隐藏了
- 迭代循环:for()、while()、… // 本质上就是 “if + goto"
- 调用 + 递归(自我调用) // 本质上也是 goto
主要方法
复杂度分析的主要方法:
- 迭代:级数求和
- 递归:递归跟踪 + 递推方程
- 猜测 + 验证
级数
算数级数
与末项平方同阶
T ( n ) = 1 + 2 + ⋯ + n = n ( n + 1 ) 2 = O ( n 2 ) T(n) = 1 + 2 + \cdots + n = \frac{n(n+1)}{2} = O(n^2) T(n)=1+2+⋯+n=2n(n+1)=O(n2)
幂方级数
比幂次高出 一阶
∑ k = 0 n k d ≈ ∫ 0 n x d + 1 d x = 1 d + 1 x d + 1 ∣ 0 n = 1 d + 1 n d + 1 = O ( n d + 1 ) \sum_{k=0}^{n} k^d \approx \int_{0}^{n} x^{d+1} \ dx = \frac{1}{d+1} x^{d+1} |_0^n = \frac{1}{d+1} n^{d+1} = O(n^{d+1}) k=0∑nkd≈∫0nxd+1 dx=d+11xd+1∣0n=d+11nd+1=O(nd+1)
T 2 ( n ) = 1 2 + 2 2 + 3 2 + ⋯ + n 2 = n ( n + 1 ) ( 2 n + 1 ) 6 = O ( n 3 ) T_2 (n) = 1^2 + 2^2 + 3^2 + \cdots + n^2 = \frac{n(n+1)(2n+1)}{6} = O(n^3) T2(n)=12+22+32+⋯+n2=6n(n+1)(2n+1)=O(n3)
T 3 ( n ) = 1 3 + 2 3 + 3 3 + ⋯ + n 3 = n 2 ( n + 1 ) 2 4 = O ( n 4 ) T_3 (n) = 1^3 + 2^3 + 3^3 + \cdots + n^3 = \frac{n^2(n+1)^2}{4} = O(n^4) T3(n