代换法
- 猜测复杂度
- 验证是否满足递归式(使用归纳法)
- 找到常数应该满足的条件
- 针对基本情况,常数足够大时总是成立的
需要注意的是,我们猜测的复杂度有可能不满足递归式,这个时候就要通过减去一些低阶项来使得归纳成立。
对递归式T(n)=4T(n/2)+CnT(n)=4T(n/2)+CnT(n)=4T(n/2)+Cn
我们假设T(n)=Θ(n2)⩽C1n2−C2nT(n)=\Theta(n^2) \leqslant C_1n^2-C_2nT(n)=Θ(n2)⩽C1n2−C2n,下面进行归纳证明:
假设k<n时T(k)⩽C1k2−C2kT(k) \leqslant C_1k^2-C_2kT(k)⩽C1k2−C2k
T(n)⩽4(C1n24−C2n2)+Cn=C1n2−C2n−(C2−C)n⩽C1n2−C2nT(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_2nT(n)⩽4(C14n2−C22n)+Cn=C1n2−C2n−(C2−C)n⩽C1n2−C2n当C2>CC_2>CC2>C时成立。
对于基本情况,当C1C_1C1足够大的时候成立。
因此,T(n)=Θ(n2)T(n)=\Theta(n^2)T(n)=Θ(n2)
递归树法
- 将递归式写成递归式求和的形式
- 逐层求和:一般来讲会有规律
对于T(n)=T(n/4)+T(n/2)+n2T(n)=T(n/4)+T(n/2)+n^2T(n)=T(n/4)+T(n/2)+n2
发现系数是等比数列,进行求和
主方法
只能应用到特定的递归式上: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)T(n)=aT(n/b)+f(n),a>1,b>1,f(n) is asymptotically postive
比较f(n)f(n)f(n)和nlogban^{log_ba}nlogba
- 如果f(n)f(n)f(n)多项式地小于nlogban^{log_ba}nlogba,T(n)=Θ(nlogba)T(n)=\Theta(n^{log_ba})T(n)=Θ(nlogba)
- 如果f(n)=Θ(nlogba⋅log2nk),k⩾0f(n)=\Theta(n^{log_ba}\cdot {log_2^n}^k),k\geqslant 0f(n)=Θ(nlogba⋅log2nk),k⩾0,T(n)=Θ(nlogba⋅log2nk+1)T(n)=\Theta(n^{log_b^a}\cdot {log_2^n}^{k+1})T(n)=Θ(nlogba⋅log2nk+1)
- 如果f(n)f(n)f(n)多项式地大于nlogban^{log_ba}nlogba,而且af(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(n3)+1T(n)=T(\sqrt[3]{n})+1T(n)=T(3n)+1
我们首先令n=2kn=2^kn=2k,即k=log2nk=log_2nk=log2n。则:
T(n)=T(2k/3)+1=...=T(1)+log3k=log3log2n=loglognT(n)=T(2^{k/3})+1=...=T(1)+log_3k=log_3{log_2n}=loglognT(n)=T(2k/3)+1=...=T(1)+log3k=log3log2n=loglogn