略标题党。借用了
前一个的标题。
解决递归式时间复杂度题目的老方法
验证仍然是带有一点不靠谱的,实际上可以采用更加靠谱和直接的办法:
暴力递归。
以下是使用暴力递归法来解
前一个的三个例子:
例 1
T(n)=4nT(n)+n=16n3/4T(n1/4)+4n+n=⋯=n(1+4+⋯+4log2log2n)=O(nlog2n)
众所周知,把
n 开根到
1 为止的次数是
log2log2n。
例 2
T(n)=T(n/2)+nlogn=T(n/4)+nlogn+(n/2)log(n/2)=⋯=nlogn+(n/2)log(n/2)+⋯≤2nlogn
log(n/2k) 全部放成
logn,然后等比数列求和。
例 3
T(n)=3T(n/2)+4T(n/4)+n
不妨设
n=2k,记
T(2k)=fk,那么
fk=3fk−1+4fk−2+2k。
记
gk=fk+2k+1/3,那么
gk=3gk−1+4gk−2。
容易看出
gk=a4k+b(−1)k(高中数学竞赛基础内容,瞪眼也能看出来)
所以
T(2k)=a4k+b(−1)k−2k+1/3=O(4k),所以
T(n)=O(n2)。
虽然其实是非常正常和直接的思路,但是好像很多人不会这种东西。
计算量不会很大的。