数据结构与算法的分析 —— 渐进复杂度(三个记号)

来源:互联网 发布:证件照合成软件 编辑:程序博客网 时间:2024/05/18 01:26

对于某些问题,一些算法更适合于用小规模的输入,而另一些则相反。幸运的是,在评价算法运行效率时,我们往往可以忽略掉其处理小规模问题时的能力差异,转而关注其在处理大规模数据时的表现。道理是显见的,处理大规模的问题时,效率的些许差异都将对实际执行效率产生巨大的影响。这种着眼长远,更为关注时间复杂度的总体变化趋势和增长速度的策略和方法,即所谓的渐进分析(asymptomatic analysis)。

O 记号

出于保守的估计,我们首先关注 T(n) 的渐进上界,为此引入大 O 记号。具体地,若存在正的常数 c 和函数 f(n),使得对任何 n>>2 都有:

T(n)cf(n)

则可认为在 n 足够大之后,f(n) 给出了 T(n) 增长速度的一个渐进上界,此时,记之为:
T(n)=O(f(n))

由这一定义,可导出大 O 记号的以下性质:

  • (1)对于任一常数 c>0,有 O(f(n))=O(cf(n))

    c>c,则cf(n)cf(n)

  • (2)对于任意常数 a>b>0,有 O(na+nb)=O(na)

    na+nb2na

Ω 记号

为了对算法的时间复杂度最好情况做出估计,需要借助另一个记号,如果存在正的常数 c 和函数 g(n),使得对于任何 n>>2 都有:

T(n)cg(n)

就可以认为,在 n 足够大之后,g(n) 给出了 T(n) 的一个渐进下界。此时我们记之为:

T(n)=Ω(g(n))

与大 O 记号恰好相反,大 Ω 是对算法执行效率的乐观估计,对于规模为 n 的任意输入,算法的运行时间都不低于 Ω(g(n))

Θ 记号

借助大 O 记号,大 Ω 记号,可以对算法的时间复杂度做出定量的界定,亦即,从渐进的趋势看,T(n) 介于 Ω(g(n))O(f(n)) 之间。若恰巧出现 g(n)=f(n) 的情况,则可以使用另一个记号表示,如果存在正的常数 c1<c2和函数 h(n),使得对于任何 n>>2,都有,

c1h(n)T(n)c2h(n)

就可以认为在 n 足够大之后,h(n) 给出了 T(n) 的一个确界,我们记之为:

T(n)=Θ(h(n))

0 0