使用主定理求解递归式
处理一个规模为 n n n的问题。通过分治,得到 a a a 个规模为 n b \frac{n}{b} bn的子问题,分解子问题和合并子问题的时间是 f ( n ) f(n) f(n)。那么,该问题的时间复杂度可表示为下面的式子: T ( n ) = a T ( n b ) + f ( n ) T(n)=aT(\frac{n}{b})+f(n) T(n)=aT(bn)+f(n)
其中, a > 1 a>1 a>1, b > 1 b>1 b>1(如果 b = 1 b=1 b=1,递推无意义)。主定理即可用来求解上述式子。
对上述式子进行讨论:
- 若存在实数 ϵ ( ϵ > 0 ) \epsilon(\epsilon>0) ϵ(ϵ>0),使得 f ( n ) = O ( n log b a ) f(n)=O\left(n^{\log_{b}{a}}\right) f(n)=O(nlogba),则 T ( n ) = Θ ( n log b a ) T(n)=\Theta(n^{\log_{b}{a}} ) T(n)=Θ(nlogba)。
- 若 f ( n ) = Θ ( n ) f(n)=\Theta(n) f(n)=Θ(n),则 T ( n ) = Θ ( n log b a log n ) T(n)=\Theta(n^{\log_{b}{a}}\log{n}) T(n)=Θ(nlogbalogn)。
- 若存在实数 ϵ ( ϵ > 0 ) \epsilon(\epsilon>0) ϵ(ϵ>0),使得 f ( n ) = Ω ( n log b a + ϵ ) f(n)=\Omega(n^{\log_{b}{a}+\epsilon}) f(n)=Ω(nlogba+ϵ),且存在实数c ( c < 1 ) (c<1) (c<1)使得较大的 n n n满足 a f ( n b ) ≤ c f ( n ) af(\frac{n}{b})≤cf(n) af(bn)≤cf(n),则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))。
简单来说,对于上述三种情况,我们将函数 f ( n ) f(n) f(n)与 n log b a n^{\log_{b}{a}} nlogba比较,较大者将决定该问题最终的时间复杂度。
- 若函数 n log b a n^{\log_{b}{a}} nlogba更大,则 T ( n ) = Θ ( n log b a ) T(n)=\Theta(n^{\log_{b}{a}} ) T(n)=Θ(nlogba)。
- 若函数 f ( n ) f(n) f(n)更大,则 T ( n ) = Θ ( f ( n ) ) T(n)=\Theta(f(n)) T(n)=Θ(f(n))。
- 若二者相等,则乘上一个对数因子, T ( n ) = O ( n log b a log n ) T(n)= O(n^{\log_{b}{a}}\log{n}) T(n)=O(nlogbalogn)。
注意上述大小是渐进意义上的大小,并且,上面三种情况并未覆盖 f ( n ) f(n) f(n)的所有可能性。情况1、情况2之间存在间隙, f ( n ) f(n) f(n)可能小于 n log b a n^{\log_{b}{a}} nlogba但不是多项式意义上的小于;情况2、情况3之间也存在间隙, f ( n ) f(n) f(n)可能大于 n log b a n^{\log_{b}{a}} nlogba但不是多项式意义上的大于;若函数 f ( n ) f(n) f(n)在这两个间隙中,或者是情况3中要求的条件不成立,就不能使用主定理来求解目标问题的时间复杂度。
主定理的应用
示例1: T ( n ) = T ( n / 2 ) + Θ ( 1 ) T(n)=T(n/2)+Θ(1) T(n)=T(n/2)+Θ(1)(二分查找)
分析, a = 1 a = 1 a=1, b = 2 b=2 b=2, Θ ( n log 2 1 ) = Θ ( 1 ) = f ( n ) Θ(n^{\log_{2}{1}})=Θ(1)=f(n) Θ(nlog21)=Θ(1)=f(n),所以 T ( n ) = Θ ( l o g n ) T(n)= Θ(logn) T(n)=Θ(logn)。
示例2: T ( n ) = 2 T ( n / 2 ) + Θ ( n ) T(n)=2T(n/2)+Θ(n) T(n)=2T(n/2)+Θ(n)(归并排序)
分析, a = b = 2 a = b=2 a=b=2, Θ ( n log 2 2 ) = Θ ( n ) = f ( n ) Θ(n^{\log_{2}{2}})=Θ(n)=f(n) Θ(nlog22)=Θ(n)=f(n)。所以 T ( n ) = Θ ( n l o g n ) T(n)=Θ(n logn) T(n)=Θ(nlogn)。