递推算法
对于递推类和循环类算法,我们一般统计其主要的基本操作个数与问题的规模大小。从而就可以推出算法复杂度。
递归算法
- 对于任意 α!=1 的通式 T(n)=T(αn)+T((1−α)n)+cn ,其时间复杂度都是 O(nlogn)
- 对于范式
T(n)=aT(n/b)+nd
,对于
a>1,b>1,d>0
,所以可以得出最后的复杂度为:
对上面分析,当 d>logba 时,那么 abd 就小于1,所以 1+abd+(abd)2+.......+(abd)logbn 的和极限一定小于某个常数,即 T(n)<C∗nd ,所以 T(n)=nd .
当 d=logba 时,那么 1+abd+(abd)2+.......+(abd)logbn 等于 logbn ,所以这个时候 T(n)=nlogbalogn .
当 d<logba 时,那么 abd 就大于1,所以 1+abd+(abd)2+.......+(abd)logbn 的和是一个随n的线性增长,即 T(n)<nlogba ,所以 T(n)=nlogba .
双层递推
如:
a∗T(n)+b∗T(n−1)+c∗T(n−2)=0
对于此类问题的分解:
采用求取特征值的求法:
ax2+bx+c=0
这样转换的原因在于,呈现上述公式的解一般是指数型解可以化简,这样x就相当于指数基数了。这样就可以最终求出 T(n) 的表达式,时间复杂度一目了然。
特殊形式
M(n)=k1M(n−1)+k2
当 k1≠1 时,这样的表达式一般表示的也是指数级别的复杂度。