对于某些问题,一些算法更适合于用小规模的输入,而另一些则相反。幸运的是,在评价算法运行效率时,我们往往可以忽略掉其处理小规模问题时的能力差异,转而关注其在处理大规模数据时的表现。道理是显见的,处理大规模的问题时,效率的些许差异都将对实际执行效率产生巨大的影响。这种着眼长远,更为关注时间复杂度的总体变化趋势和增长速度的策略和方法,即所谓的渐进分析(asymptomatic analysis)。
1. 大 O 记号
出于保守的估计,我们首先关注
则可认为在 n 足够大之后,
由这一定义,可导出大 O 记号的以下性质:
(1)对于任一常数
c>0 ,有 O(f(n))=O(c⋅f(n))取 c′>c ,则 c⋅f(n)≤c′⋅f(n)
(2)对于任意常数 a>b>0 ,有 O(na+nb)=O(na)
na+nb≤2⋅na
2. 大 Ω 记号
为了对算法的时间复杂度最好情况做出估计,需要借助另一个记号,如果存在正的常数 c 和函数
g(n) ,使得对于任何 n>>2 都有:T(n)≥c⋅g(n)就可以认为,在 n 足够大之后,
g(n) 给出了 T(n) 的一个渐进下界。此时我们记之为:T(n)=Ω(g(n))与大 O 记号恰好相反,大
Ω 是对算法执行效率的乐观估计,对于规模为 n 的任意输入,算法的运行时间都不低于Ω(g(n)) 。3. 大 Θ 记号
借助大 O 记号,大
Ω 记号,可以对算法的时间复杂度做出定量的界定,亦即,从渐进的趋势看, T(n) 介于 Ω(g(n)) 与 O(f(n)) 之间。若恰巧出现 g(n)=f(n) 的情况,则可以使用另一个记号表示,如果存在正的常数 c1<c2 和函数 h(n) ,使得对于任何 n>>2 ,都有,c1⋅h(n)≤T(n)≤c2⋅h(n)就可以认为在 n 足够大之后,
h(n) 给出了 T(n) 的一个确界,我们记之为:
T(n)=Θ(h(n))