# 基本概念

# 算法 (Algorithm)

  • 算法是指解决问题的一种方法或一个过程。
  • 算法是若干指令的有穷序列,满足性质:
    • 输入,输出,确定性,有限性

# 程序 (Program)

  • 程序是算法用某种程序设计语言的具体实现。
  • 程序可以不满足算法的性质 (4) 有限性。
  • 例如操作系统,是一个在无限循环中执行的程序,因而不是一个算法。
  • 操作系统的各种任务可看成是单独的问题,每一个问题由操作系统中的一个子程序通过特定的算法来实现。该子程序得到输出结果后便终止。

# 算法分析基本概念

  • 算法运行所需要的计算机资源的量称为算法的复杂性。
  • 算法的时间复杂性T(n)T(n)
  • 算法的空间复杂性S(n)S(n)
  • 其中 n 是问题的规模(输入大小)。
    计算算法运行所需资源量的过程称为算法复杂性分析,简称为算法分析。

# 算法的时间复杂性

  1. 最坏情况下的时间复杂性
    Tmax(n)=maxT_{max}(n) = max
  2. 最好情况下的时间复杂性
    Tmin(n)=minT_{min}(n) = min
  3. 平均情况下的时间复杂性
    Tavg(n)=size(I)=nP(I)T(I)T_{avg}(n) =\displaystyle \sum _{size(I)=n}P(I)T(I)

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

# 算法渐近复杂性

T(n),as nT(n) \to \infty , as \ n\to \infty;
(T(n)t(n))/T(n)0as n(T(n) - t(n) )/ T(n) \to 0 ,as \ n\to \infty;
t (n) 是 T (n) 的渐近性态,为算法的渐近复杂性。
在数学上, t (n) 是 T (n) 的渐近表达式,是 T (n) 略去低阶项留下的主项。它比 T (n) 简单。

# 渐近分析的记号

在下面的讨论中,对所有nf(n)0g(n)0n,f(n) \geq 0,g(n) \geq 0

  1. 渐近上界记号OO
    O(g(n))={f(n)存在正常数cn0使得对所有nn0有:f(n)cg(n)} O(g(n))=\{f(n) | 存在正常数c和n_0使得对所有n\geq n_0有: f(n) \leq cg(n) \}

  2. 渐近下界记号Ω\Omega
    Ω(g(n))={f(n)存在正常数cn0使得对所有nn0有:0cg(n)f(n)} \Omega(g(n))=\{f(n) | 存在正常数c和n_0使得对所有n\geq n_0有:0 \leq cg(n) \leq f(n) \}

  3. 非紧上界记号oo
    o(g(n))={f(n)对于任何正常数c>0,存在正数n0>0使得对所有nn0有:0f(n)cg(n)}o(g(n)) = \{ f(n) | 对于任何正常数c > 0,存在正数n_0>0使得对所有n\geq n_0有:0 \leq f(n) \leq cg(n) \}
    等价于 f(n)/g(n)0,as nf(n) / g(n) \to 0,as \ n\to \infty

  4. 非紧下界记号ω\omega
    ω(g(n))={f(n)对于任何正常数c>0,存在正数n0>0使得对所有nn0有:0cg(n)f(n)}\omega(g(n)) = \{ f(n) | 对于任何正常数c > 0,存在正数n_0>0使得对所有n\geq n_0有:0 \leq cg(n) \leq f(n) \}
    等价于 f(n)/g(n),as nf(n) / g(n) \to \infty,as \ n\to \infty
    f(n)ω(g(n))    g(n)o(f(n))f(n)\in \omega (g(n))\iff g(n) \in o(f(n))

  5. 紧渐近界记号Θ\Theta
    Θ(g(n))={f(n)存在正常数c1,c2n0使得对所有nn0有:c1g(n)f(n)c2g(n)}\Theta (g(n))=\{ f(n) | 存在正常数c_1,c_2和n_0使得对所有n \geq n_0有:c_1g(n) \leq f(n) \leq c_2g(n)\}

  • 注意到,紧渐进和非紧渐进的区别在于常数 c 是不是任意的,渐进是指量级相同,例如2n2,3n22n^2,3n^2, 而非紧渐进则是量级不同,例如n2,n3n^2,n^3
  • 同时,上下界不止一个,所以该函数 (例如O(g(n))O(g(n))) 的指向也是不定的,他可以同时代表多个满足条件的多项式,详见下文
  • 定理 1:Θ(g(n))=O(g(n))Ω(g(n))\Theta(g(n))=O(g(n))\cap \Omega(g(n))

# 渐近分析记号在等式和不等式中的意义

  • f(n)=Θ(g(n))f(n)=\Theta(g(n)) 的确切意义是:f(n)Θ(g(n))f(n)\in \Theta(g(n))
  • 一般情况下,等式和不等式中的渐近记号Θ(g(n))\Theta(g(n)) 表示Θ(g(n))\Theta(g(n)) 中的某个函数。

# 渐近分析记号的若干性质

  1. 传递性
    1. f(n)=Θ(g(n)),g(n)=Θ(b(n))    f(n)=Θ(b(n))f(n)=\Theta(g(n)),g(n)=\Theta(b(n)) \implies f(n)=\Theta(b(n))
    2. 上述Θ\Theta 可换成任意其他四个符号
  2. 反身性
    1. f(n)=Θ(f(n))f(n)=\Theta(f(n))
    2. f(n)=O(f(n))f(n)=O(f(n))
    3. f(n)=Ω(f(n))f(n)=\Omega(f(n))
  3. 对称性
    f(n)=Θ(g(n))    g(n)=Θ(f(n))f(n)=\Theta(g(n)) \iff g(n)=\Theta(f(n))
  4. 互对称性
    1. f(n)=O(g(n))    g(n)=Ω(f(n))f(n)=O(g(n)) \iff g(n)=\Omega(f(n))
    2. f(n)=o(g(n))    g(n)=ω(f(n))f(n)=o(g(n)) \iff g(n)=\omega(f(n))

算术运算

  1. O(f(n))+O(g(n))=O(max{f(n),g(n)})O(f(n))+O(g(n))=O(max\{f(n),g(n)\})
证明
  • 对于任意 f1(n)O(f(n))_1(n)\in O(f(n)), 存在正常数c1c_1 和自然数n1n_1, 使得对所有nn1n \geq n_1,有f1(n)c1f(n)f_1(n) \leq c_1f(n)
  • 类似地,对于任意g1(n)O(g(n))g_1(n) \in O(g(n)) ,存在正常数c2c_2 和自然数n2n_2,使得对所有nn2n\geq n_2,有g1(n)c2g(n)g_1(n) \leq c_2g(n)
  • c3=max{c1,c2}n3=max{n1,n2}h(n)=max{f(n),g(n)}c_3=max\{c_1, c_2\}, n_3 =max\{n_1, n_2\},h(n)= max\{f(n),g(n)\}
  • 则对所有的 nn3n \geq n_3,有
    f1(n)+g1(n)c1f(n)+c2g(n)f_1(n) +g_1(n) \leq c_1f(n) + c_2g(n)
    c3f(n)+c3g(n)=c3(f(n)+g(n))\leq c_3f(n) + c_3g(n)= c_3(f(n) + g(n))
    c3 2max{f(n),g(n)}\leq c_3\ 2 max\{f(n),g(n)\}
    =2c3h(n)=O(max{f(n),g(n)})= 2c_3h(n) = O(max\{f(n),g(n)\})
  1. O(f(n))+O(g(n))=O(f(n)+g(n))O(f(n))+O(g(n))=O(f(n)+g(n))
证明
  • 对于任意 f1(n)O(f(n))_1(n)\in O(f(n)), 存在正常数c1c_1 和自然数n1n_1, 使得对所有nn1n \geq n_1,有f1(n)c1f(n)f_1(n) \leq c_1f(n)
  • 类似地,对于任意g1(n)O(g(n))g_1(n) \in O(g(n)) ,存在正常数c2c_2 和自然数n2n_2,使得对所有nn2n\geq n_2,有g1(n)c2g(n)g_1(n) \leq c_2g(n)
  • c3=max{c1,c2}n3=max{n1,n2}c_3=max\{c_1, c_2\}, n_3 =max\{n_1, n_2\}
  • 则对所有的 nn3n \geq n_3,有
    f1(n)+g1(n)c1f(n)+c2g(n)f_1(n) +g_1(n) \leq c_1f(n) + c_2g(n)
    c3f(n)+c3g(n)=c3(f(n)+g(n))\leq c_3f(n) + c_3g(n)= c_3(f(n) + g(n))
    =O(f(n)+g(n))= O(f(n)+g(n))
  1. O(f(n))×O(g(n))=O(f(n)×g(n))O(f(n))\times O(g(n))=O(f(n)\times g(n))
证明
  • 对于任意 f1(n)O(f(n))_1(n)\in O(f(n)), 存在正常数c1c_1 和自然数n1n_1, 使得对所有nn1n \geq n_1,有f1(n)c1f(n)f_1(n) \leq c_1f(n)
  • 类似地,对于任意g1(n)O(g(n))g_1(n) \in O(g(n)) ,存在正常数c2c_2 和自然数n2n_2,使得对所有nn2n\geq n_2,有g1(n)c2g(n)g_1(n) \leq c_2g(n)
  • c3=max{c1,c2}n3=max{n1,n2}c_3=max\{c_1, c_2\}, n_3 =max\{n_1, n_2\}
  • 则对所有的 nn3n \geq n_3,有
    f1(n)×g1(n)c1f(n)×c2g(n)f_1(n) \times g_1(n) \leq c_1f(n) \times c_2g(n)
    c1×c2f(n)×g(n)=c3(f(n)×g(n))\leq c_1\times c_2 f(n) \times g(n)= c_3(f(n) \times g(n))
    O(f(n)×g(n))O(f(n)\times g(n))
  1. g(n)=O(f(n))    O(f(n))+O(g(n))=O(f(n))g(n)=O(f(n))\implies O(f(n))+O(g(n))=O(f(n))
证明
  • 对于任意 f1(n)O(f(n))_1(n)\in O(f(n)), 存在正常数c1c_1 和自然数n1n_1, 使得对所有nn1n \geq n_1,有f1(n)c1f(n)f_1(n) \leq c_1f(n)
  • 对于任意g(n)O(f(n))g(n) \in O(f(n)) ,存在正常数c2c_2 和自然数n2n_2,使得对所有nn2n\geq n_2,有g(n)c2f(n)g(n) \leq c_2f(n)
  • 对于任意g1(n)O(g(n))g_1(n) \in O(g(n)) ,存在正常数c3c_3 和自然数n2n_2,使得对所有nn3n\geq n_3,有g1(n)c3g(n)g_1(n) \leq c_3g(n)
  • c4=max{c1,c2×c3}n4=max{n1,n2,n3}c_4=max\{c_1, c_2\times c_3\}, n_4 =max\{n_1, n_2,n_3\}
  • 则对所有的 nn4n \geq n_4,有
    O(f(n))+O(g(n))=f1(n)+g1(n)c1f(n)+c3g(n)O(f(n))+O(g(n))=f_1(n)+g_1(n) \leq c_1f(n) + c_3g(n)
    c1f(n)+c3×c2f(n)\leq c_1f(n) + c_3\times c_2f(n)
    c4f(n)\leq c_4f(n)
    =O(f(n))= O(f(n))
  1. O(cf(n))=O(f(n))O(cf(n))=O(f(n)), 其中 c 为正常数
证明
  • 对于任意 f1(n)O(cf(n))_1(n)\in O(cf(n)), 存在正常数c1c_1 和自然数n1n_1, 使得对所有nn1n \geq n_1,有f1(n)c1cf(n)f_1(n) \leq c_1cf(n)
  • c2=max{c1c,c1,c}c_2=max\{c_1c, c_1,c\}
  • 则对所有的 nn1n \geq n_1,有
    f1(n)c1cf(n)f_1(n) \leq c_1cf(n)
    c2f(n)=O(f(n))\leq c_2f(n)=O(f(n))
  1. f(n)=O(f(n))f(n)=O(f(n))
证明

渐进上界记号定义为:
O(g(n))={f(n)存在正常数cn0使得对所有nn0有:f(n)cg(n)} O(g(n))=\{f(n) | 存在正常数c和n_0使得对所有n\geq n_0有: f(n) \leq cg(n) \}
g(n)=f(n),c=1g(n)=f(n),c=1, 代入即可

# 算法渐近复杂性分析中常用函数

  • alogbc=alogclogb=alogcloga×logalogb=a(logcloga)(logalogb)=clogalogb=clogba a^{log_bc}=a^{\frac{logc}{logb}}=a^{\frac{logc}{loga} \times \frac{loga}{logb}}=a^{(\frac{logc}{loga})^{(\frac{loga}{logb})}}=c^{\frac{loga}{logb}}=c^{log_ba}
  • n!=2πn(ne)n(1+Θ(1n))n!=\sqrt{2\pi n}(\frac{n}{e})^n(1+\Theta(\frac{1}{n}))
  • n!=2πn(ne)neαn,112n+1<αn<112n n!=\sqrt{2\pi n}(\frac{n}{e})^ne^{\alpha_n},\frac{1}{12n+1}<\alpha_n<\frac{1}{12n}
  • n!=o(nn)n!=o(n^n)
  • n!=ω(2n)n!=\omega(2^n)
  • log(n!)=Θ(nlogn)log(n!)=\Theta(nlogn)

# 算法分析的基本法则

# 非递归算法:

  1. for /while 循环
    循环体内计算时间 * 循环次数;
  2. 嵌套循环
    循环体内计算时间 * 所有循环次数;
  3. 顺序语句
    各语句计算时间相加;
  4. if-else 语句
    if 语句计算时间和 else 语句计算时间的较大者。
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

小春日和 微信支付

微信支付

小春日和 支付宝

支付宝

小春日和 wechat

wechat