递归式复杂度求解

代换法

  1. 猜测复杂度
  2. 验证是否满足递归式(使用归纳法)
  3. 找到常数应该满足的条件
  4. 针对基本情况,常数足够大时总是成立的

需要注意的是,我们猜测的复杂度有可能不满足递归式,这个时候就要通过减去一些低阶项来使得归纳成立。

对递归式 T ( n ) = 4 T ( n / 2 ) + C n T(n)=4T(n/2)+Cn T(n)=4T(n/2)+Cn
我们假设 T ( n ) = Θ ( n 2 ) ⩽ C 1 n 2 − C 2 n T(n)=\Theta(n^2) \leqslant C_1n^2-C_2n T(n)=Θ(n2)C1n2C2n,下面进行归纳证明:
假设k T ( k ) ⩽ C 1 k 2 − C 2 k T(k) \leqslant C_1k^2-C_2k T(k)C1k2C2k
T ( n ) ⩽ 4 ( C 1 n 2 4 − C 2 n 2 ) + C n = C 1 n 2 − C 2 n − ( C 2 − C ) n ⩽ C 1 n 2 − C 2 n T(n)\leqslant 4(C_1\frac{n^2}{4}-C_2\frac{n}{2})+Cn=C_1n^2-C2n-(C2-C)n\leqslant C_1n^2-C_2n T(n)4(C14n2C22n)+Cn=C1n2C2n(C2C)nC1n2C2n C 2 > C C_2>C C2>C时成立。

对于基本情况,当 C 1 C_1 C1足够大的时候成立。

因此, T ( n ) = Θ ( n 2 ) T(n)=\Theta(n^2) T(n)=Θ(n2)

递归树法

  • 将递归式写成递归式求和的形式
  • 逐层求和:一般来讲会有规律

对于 T ( n ) = T ( n / 4 ) + T ( n / 2 ) + n 2 T(n)=T(n/4)+T(n/2)+n^2 T(n)=T(n/4)+T(n/2)+n2
递归式复杂度求解_第1张图片
发现系数是等比数列,进行求和

主方法

只能应用到特定的递归式上: T ( n ) = a T ( n / b ) + f ( n ) , a > 1 , b > 1 , f ( n ) T(n)=aT(n/b)+f(n),a>1,b>1,f(n) T(n)=aT(n/b)+f(n),a>1,b>1,f(n) is asymptotically postive

比较 f ( n ) f(n) f(n) n l o g b a n^{log_ba} nlogba

  • 如果 f ( n ) f(n) f(n)多项式地小于 n l o g b a n^{log_ba} nlogba T ( n ) = Θ ( n l o g b a ) T(n)=\Theta(n^{log_ba}) T(n)=Θ(nlogba)
  • 如果 f ( n ) = Θ ( n l o g b a ⋅ l o g 2 n k ) , k ⩾ 0 f(n)=\Theta(n^{log_ba}\cdot {log_2^n}^k),k\geqslant 0 f(n)=Θ(nlogbalog2nk)k0 T ( n ) = Θ ( n l o g b a ⋅ l o g 2 n k + 1 ) T(n)=\Theta(n^{log_b^a}\cdot {log_2^n}^{k+1}) T(n)=Θ(nlogbalog2nk+1)
  • 如果 f ( n ) f(n) f(n)多项式地大于 n l o g b a n^{log_ba} nlogba,而且 a f ( n / b ) ⩽ ( 1 − ϵ ) f ( n ) af(n/b)\leqslant(1-\epsilon)f(n) af(n/b)(1ϵ)f(n),则 T ( n ) = Θ ( f ( n ) T(n)=\Theta(f(n) T(n)=Θ(f(n)

其他

虽然上面的方法可以解决绝大部分问题,但是还有一些问题无法用上面的方法进行解决,需要使用一定的数学技巧。

例如,如果递归式中出现了指数运算,我们首先应该用幂次代替n,然后变成除法运算再得到结果。

例如: T ( n ) = T ( n 3 ) + 1 T(n)=T(\sqrt[3]{n})+1 T(n)=T(3n )+1

我们首先令 n = 2 k n=2^k n=2k,即 k = l o g 2 n k=log_2n k=log2n。则:
T ( n ) = T ( 2 k / 3 ) + 1 = . . . = T ( 1 ) + l o g 3 k = l o g 3 l o g 2 n = l o g l o g n T(n)=T(2^{k/3})+1=...=T(1)+log_3k=log_3{log_2n}=loglogn T(n)=T(2k/3)+1=...=T(1)+log3k=log3log2n=loglogn

你可能感兴趣的:(算法)