主定理适用于递归复杂度计算。
标准版:
a,b 是常数,f(n) 为额外附加值函数 T(n) 为递归式 T(n)=aT(bn)+f(n) (a>0,b>1),就有:
- 当 f(n)=O(n(logba)−ϵ) 其中 ϵ>0 是一个常数(相当于 logba>f(n)),则有 T(n)=Θ(nlogba);
- 当 f(n)=Θ(nlogba),则有 T(n)=Θ(nlogbalogn);
- 当 f(n)=Ω(n(logba)+ϵ) 其中 ϵ>0 是一个常数(相当于 logba<f(n)),且对于一个常数 c<1 和所有足够大的 n 有 af(bn)≤cf(n)(这一条件在这里可以暂时忽略不看,但在证明时起到至关重要的作用),则有 T(n)=Θ(f(n)).
- 当 f(n)=Θ(nlogbalogkn) 其中 k≥1 是一个常数,则有 T(n)=Θ(nlogbalogk+1n);
举例:
例一:T(n)=4T(2n)+n,此时 a=4,b=2,ϵ=1,那么 logba=log24=2,f(n)=O(nlogba−ϵ)=O(n2−1),f(n) 成立,所以 T(n)=Θ(nlogba)=Θ(n2)。
例二:T(n)=2T(2n)+n,此时 a=2,b=2,那么 logba=log22=1,f(n)=Θ(nlogba)=Θ(n),f(n) 成立,所以 T(n)=Θ(nlogbalogn)=Θ(nlogn)。
例三:T(n)=4T(2n)+n3,此时 a=4,b=2,ϵ=1,那么 logba=log24=2,f(n)=Ω(nlogba+ϵ)=Ω(n2+1),对于 c=32 和够大的 n,(af(bn)=4(2n)3=4(8n3)=2n3)≤(cf(n)=32n3),f(n) 成立,所以 T(n)=Θ(f(n))=Θ(n3)。
例四:T(n)=2T(2n)+nlogn,此时 a=2,b=2,k=1,那么 logba=log22=1,f(n)=Θ(nlogbalogkn)=Θ(nlogn),f(n) 成立,所以 T(n)=Θ(nlogbalogk+1n)=Θ(nlog2n)。
简化版
将一个规模为 n 的问题,通过分治得到 a 个规模为 bn 的子问题,每次递归进行的计算为 O(nd),满足如下形式:
T(n)=a⋅T(bn)+O(nd)
则 T(n) 满足:
T(n)=⎩⎨⎧O(nd)O(ndlogn)O(nlogba)d>logbad=logbad<logba
例如:
有递归式:
T(n)={O(1)2T(2n)+nn=1otherwise.
则有 a=2,b=2,d=1。
∵1=log22∴T(n)=O(n1logn)=O(nlogn)
另一例子:
T(n)={O(1)2T(2n)+1n=1otherwise.
则有 a=2,b=2,d=0。
∵0<log22∴T(n)=O(nlog22)=O(n)
例三:
T(n)={O(1)2T(2n)+nlognn=1otherwise.
则有 a=2,b=2,d=1。
∵1=log22∴T(n)=O(n1logn⋅logn)=O(nlog2n)