主定理(Master Theorem)

使用主定理求解递归式

处理一个规模为 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) Θ(nlog2⁡1)=Θ(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) Θ(nlog2⁡2)=Θ(n)=f(n)。所以 T ( n ) = Θ ( n l o g n ) T(n)=Θ(n logn) T(n)=Θ(nlogn)

猜你喜欢

转载自blog.csdn.net/qq_40773984/article/details/127096776