五个渐进符号:
下面给出渐进符号θ的数学定义:当n足够大时,存在两个正常数c1、c2使得c1g(n)<=f(n)<=c2g(n),记作f(n)=θ(g(n))。
引入渐进符号描述算法的时间复杂度的好处:能够忽略机器之间的差异。例如当n足够大是,一个复杂度为θ(n2)的算法无论在什么机器下运行的性能都将优于复杂度为θ(n3)的算法。
通常,我们规定T(n)为一个算法的最长可能消耗时间。换个角度,如果T(n)不是最长消耗时间,而是和规模为n的问题的具体内容有关,那么T(n)就不是n的函数了。
有时候,我们也用T(n)来表示一个算法的平均运行时间,前提是我们知道输入的分布情况。
T
(
n
)
=
∑
每
种
输
入
的
概
率
∗
该
输
入
下
算
法
的
运
行
时
间
T(n)=∑每种输入的概率*该输入下算法的运行时间
T(n)=∑每种输入的概率∗该输入下算法的运行时间
我们不用T(n)描述一个算法的最好情况,因为一个算法的最好情况往往是在特定的输入下取得的,实际的输入大部分都不同于特定的输入,因此这是没有意义的。
最后,介绍三种常用的求解递推式的方法。
- 主方法 套用主方法定理即可。
- 代入法:代入法的关键之处在于先猜出答案,在利用数学归纳法推导出猜测是正确的。下面具体举例:T(n)=2T(n/2)+n。首先我们猜测解的形式为O(nlgn)。注意到T(1)>0,不满足O(nlgn),所以数学归纳法的起点不能是n=1.我们假设n=2时,存在常数c,有T(n)<=cnlgn.代入上式中的T(n/2),我们最终希望得到的结果是能严格推出T(n)<=cnlgn.
- 递归树法:将递归式转化为等价的递归树,T(n)的值为递归树每一个节点之和。