这一段时间,我研究了一下算法的时间复杂度分析,感觉其中的递归分析挺有意思,就总结一下记录下来,以备以后随时复习查看。
下面假设递归方程式已经给出了,仅仅说明如何计算递归方程的时间复杂度。
对于递归方程的时间复杂度分析,需要分为两个步骤,计算和证明
一、步骤一:计算
遇到一个递归方程,首先看这个递归方程的形式,根据不同的形式又分为两种不同的计算方法:
1.形式如: T(n)=aT(nb)+f(n) 的递归函数
对于形如
T(n)=aT(nb)+f(n)
的递归函数,我们可以使用下面的公式进行计算其时间复杂度:
注意:上面的公式中 a>1,b>1 均为正数, f(n) 为确定的正函数。
2.形式如: T(n)=C1T(n−1)+C2T(n−2)+⋯+CkT(n−k)+f(n) 的递归函数
对于形如
T(n)=C1T(n−1)+C2T(n−2)+⋯+CkT(n−k)+f(n)
的递归函数,要求其中
C1,C2,…,Ck≠0
的常数,同时会有
k
个已知的等式
首先从递归式
入手,将该递归式式移项得:
然后写出其对应的齐次方程,即根据含有 T(n),T(n−1),T(n−2),…,T(n−k) 的个数减去1来确定方程未知数的最大次数为 k ,然后将方程中的
根据该方程的形式,可以知道如果该方程的某个解 t=r 是 m 重根,则
然后假设每个解的形式对应的系数分别为 a1,a2,…,ak ,则可以写出齐次方程的通解形式:
为了求解通解中的未知系数 a1,a2,…,ak ,需要先求的齐次方程的特解,下面给出特解形式表格,为了简便,令 C(t)=T(n)−C1T(n−1)−C2T(n−2)−⋯−CkT(n−k)
f(n) 形式 | 条件 | 特解形式 |
---|---|---|
an |
C(a)≠0
———————- a 是 |
———– p0nman |
ns |
C(1)≠0
———————- 1 是 |
————————————————– nm(p0+p1n+p2n2+…+psns) |
nsan |
C(a)≠0
———————- a 是 |
—————————————————- nm(p0+p1n+p2n2+…+psns)an |
常数 | 无 | 常数 x |
注意:这个表格中需要求的未知数是:
最后将递归方程的 k 个已知的等式
二、步骤二:证明
将第一步算出的时间复杂度带入原来的递归方程,如果没有出现矛盾,则是可能的解,最后用数学归纳法证明即可。
三、举例说明
以后再加上……
References:
python27的博客:http://www.cnblogs.com/python27/archive/2011/12/09/2282486.html