算法分析基础

算法分析基本概念

算法分析(analysis of algorithms) 是对一个算法需要多少计算时间存储空间作定量得分析,确定算法在什么样得环境下能够有效地运行。分析其在最好最坏平均情况下的执行情况,并对同一问题不同算法的有效性作出比较。

全面分析算法的两个阶段:

事前分析(a priori analysis):

  • 确定每条语句的执行次数;
  • 求出该算法的一个时间限界函数(关于问题规模 n 的函数)。

事后测试(a posterior testing):

  • 作时空性能分布图。

算法的执行时间:

  • 同一条语句在一个算法中的执行次数称为频率计数(frequency count),由算法直接确定,与所用的机器无关,且独立于程序设计语言。

  • 语句的时间总量 = 频率计数 × 执行一次该语句所需要的时间

  • 算法的执行时间就是构成算法的所有语句的执行时间总量之和。

时间复杂度的形式化定义:

算法的时间复杂度用 T(n)T(n) 表示,空间复杂度用 S(n)S(n) 表示,其中 nn 是问题的规模。

最坏情况下:

Tmax(n)=max{T(I)size(I)=n}T_{max}(n) = \max\{ T(I) \mid \mathrm{size}(I) = n \}

最好情况下:

Tmin(n)=min{T(I)size(I)=n}T_{min}(n) = \min\{ T(I) \mid \mathrm{size}(I) = n \}

平均情况下:

Tavg(n)=size(I)=np(I)T(I)T_{avg}(n) = \sum_{\mathrm{size}(I) = n} p(I) T(I)

其中 II 是问题的规模为 nn 的实例,p(I)p(I) 是实例 II 出现的概率。

计算时间的渐进表示

定义: 如果存在两个正常数 ccn0n_0,对于所有的 nn0n \geq n_0,有 f(n)cg(n)|f(n)| \leq c|g(n)|,则记作 f(n)=O(g(n))f(n) = O(g(n)).

nn 充分大时,f(n)f(n) 有上界,一个常数倍的 g(n)g(n)f(n)f(n) 的一个上界,f(n)f(n) 的阶不高于 g(n)g(n) 的阶。

OO 的性质: 对于非负的 f(n)f(n)g(n)g(n),有如下性质:

  1. f(n)=O(f(n))f(n) = O(f(n))
  2. O(f(n))+O(g(n))=O(f(n)+g(n))O(f(n)) + O(g(n)) = O(f(n) + g(n))
  3. O(f(n))O(g(n))=O(f(n)g(n))O(f(n)) O(g(n)) = O(f(n) g(n))
  4. O(f(n))+O(g(n))=O(max{f(n),g(n)})O(f(n)) + O(g(n)) = O(\max\{ f(n), g(n) \})
  5. O(cf(n))=O(f(n))O(cf(n)) = O(f(n)),其中 cc 是一个正的常数;
  6. 如果 g(n)=O(f(n))g(n) = O(f(n)),则 O(f(n))+O(g(n))=O(f(n))O(f(n)) + O(g(n)) = O(f(n)).

证明 O(f(n))+O(g(n))=O(max{f(n),g(n)})O(f(n)) + O(g(n)) = O(\max\{ f(n), g(n) \}).

证:不妨设 p(n)=max{f(n),g(n)}p(n) = \max\{ f(n), g(n) \}
f(n)=O(f(n))f'(n) = O(f(n)),则存在 c1,n1c_1, n_1,当 nn1n \geq n_1 时,f(n)c1f(n)f'(n) \leq c_1 f(n)
g(n)=O(g(n))g'(n) = O(g(n)),则存在 c2,n2c_2, n_2,当 nn2n \geq n_2 时,g(n)c1g(n)g'(n) \leq c_1 g(n)
O(f(n))+O(g(n))=f(n)=g(n)O(f(n)) + O(g(n)) = f'(n) = g'(n).

nmax{n1,n2}n \geq \max\{ n_1, n_2 \} 时,

f(n)+g(n)c1f(n)+c2g(n)c1p(n)+c2p(n)=(c1+c2)p(n)f'(n) + g'(n) \leq c_1 f(n) + c_2 g(n) \leq c_1 p(n) + c_2 p(n) = (c_1 + c_2) p(n)

即存在 c3=c1+c2c_3 = c_1 + c_2n3=max{n1,n2}n_3 = \max\{ n_1, n_2 \},当 nn3n \geq n_3 时,f(n)+g(n)c3p(n)f'(n) + g'(n) \leq c_3 p(n).
O(f(n))+O(g(n))=O(max{f(n),g(n)})O(f(n)) + O(g(n)) = O(\max\{ f(n), g(n) \}).

数量级对算法有效性的影响: 从计算时间上,算法可以分为两类:

  • 多项式时间算法:用多项式来计算时间限界的算法,例如

O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)O(1) < O(\log{n}) < O(n) < O(n \log{n}) < O(n^2) < O(n^3)

  • 指数时间算法:用指数函数来计算时间限界的算法,例如

O(2n)<O(n!)<O(nn)O(2^n) < O(n!) < O(n^n)

定义: 如果存在两个正常数 ccn0n_0,对于所有的 nn0n \geq n_0,有 f(n)cg(n)|f(n)| \geq c|g(n)|,则记作 f(n)=Ω(g(n))f(n) = \Omega(g(n)).

nn 充分大时,f(n)f(n) 有下界,一个常数倍的 g(n)g(n)f(n)f(n) 的一个下界,f(n)f(n) 的阶不低于 g(n)g(n) 的阶。

Ω\Omega 的性质: 对于非负的 f(n)f(n)g(n)g(n),有如下性质:

  1. f(n)=Ω(f(n))f(n) = \Omega(f(n))
  2. Ω(f(n))+Ω(g(n))=Ω(f(n)+g(n))\Omega(f(n)) + \Omega(g(n)) = \Omega(f(n) + g(n))
  3. Ω(f(n))Ω(g(n))=Ω(f(n)g(n))\Omega(f(n)) \Omega(g(n)) = \Omega(f(n) g(n))
  4. Ω(f(n))+Ω(g(n))=Ω(min{f(n),g(n)})\Omega(f(n)) + \Omega(g(n)) = \Omega(\min\{ f(n), g(n) \})
  5. Ω(cf(n))=Ω(f(n))\Omega(cf(n)) = \Omega(f(n)),其中 cc 是一个正的常数;
  6. 如果 g(n)=Ω(f(n))g(n) = \Omega(f(n)),则 Ω(f(n))+Ω(g(n))=Ω(f(n))\Omega(f(n)) + \Omega(g(n)) = \Omega(f(n)).

定义: 如果存在正常数 c1,c2c_1, c_2n0n_0,对于所有的 nn0n \geq n_0,有 c1g(n)f(n)c2g(n)c_1|g(n)| \leq |f(n)| \leq c_2|g(n)|,则记作 f(n)=Θ(g(n))f(n) = \Theta(g(n)).

一个算法若满足 f(n)=Θ(g(n))f(n) = \Theta(g(n)),则意味着该算法在最好和最坏情况下的计算时间就一个常数因子范围内是相同的。

Θ\Theta 的性质: 对于非负的 f(n)f(n)g(n)g(n),有如下性质:

  1. f(n)=Θ(f(n))f(n) = \Theta(f(n))
  2. Θ(f(n))+Θ(g(n))=Θ(f(n)+g(n))\Theta(f(n)) + \Theta(g(n)) = \Theta(f(n) + g(n))
  3. Θ(f(n))Θ(g(n))=Θ(f(n)g(n))\Theta(f(n)) \Theta(g(n)) = \Theta(f(n) g(n))
  4. Θ(f(n))+Θ(g(n))=Θ(max{f(n),g(n)})\Theta(f(n)) + \Theta(g(n)) = \Theta(\max\{ f(n), g(n) \})
  5. Θ(cf(n))=Θ(f(n))\Theta(cf(n)) = \Theta(f(n)),其中 cc 是一个正的常数。
  6. 如果 g(n)=Θ(f(n))g(n) = \Theta(f(n)),则 Θ(f(n))+Θ(g(n))=Θ(f(n))\Theta(f(n)) + \Theta(g(n)) = \Theta(f(n)).

渐近表示函数具有传递性:

f(n)=O(g(n)),g(n)=O(h(n))f(n)=O(h(n))f(n)=Ω(g(n)),g(n)=Ω(h(n))f(n)=Ω(h(n))f(n)=Θ(g(n)),g(n)=Θ(h(n))f(n)=Θ(h(n))f(n) = O(g(n)), g(n) = O(h(n)) \Rightarrow f(n) = O(h(n))\\ f(n) = \Omega(g(n)), g(n) = \Omega(h(n)) \Rightarrow f(n) = \Omega(h(n))\\ f(n) = \Theta(g(n)), g(n) = \Theta(h(n)) \Rightarrow f(n) = \Theta(h(n))\\

常用的整数求和公式:

1in1=Θ(n)1ini=n(n+1)2=Θ(n2)1ini2=n(n+1)(2n+1)6=Θ(n3)\begin{aligned} \sum_{1 \leq i \leq n} 1 &= \Theta(n)\\ \sum_{1 \leq i \leq n} i &= \frac{n(n + 1)}{2} = \Theta(n^2)\\ \sum_{1 \leq i \leq n} i^2 &= \frac{n(n + 1)(2n + 1)}{6} = \Theta(n^3) \end{aligned}

通式:

1inik=nk+1k+1+nk2+=Θ(nk+1)\sum_{1 \leq i \leq n} i^k = \frac{n^{k + 1}}{k + 1} + \frac{n^k}{2} + \cdots = \Theta(n^{k + 1})