在计算机科学中,主定理(Master Theorem)用于解决递归关系的渐进界。特别是在分析分治算法的复杂度时,主定理提供了一种简便的方法来确定递归方程的时间复杂度。主定理主要适用于以下形式的递归关系:
T
(
n
)
=
a
×
T
(
n
b
)
+
f
(
n
)
T(n) = a \times T(\frac{n}{b}) + f(n)
T(n)=a×T(bn)+f(n)
其中:
- a ≥ 1 a \geq 1 a≥1,且是子问题的数量,
- b > 1 b>1 b>1且是每个子问题的规模减小的因子,
- f ( n ) f(n) f(n)是在分解和合并子问题时花费的时间。
主定理分为三种情况:
-
情况1:如果 f ( n ) = O ( n c ) f(n) = O(n^c) f(n)=O(nc) 其中 c < log b a c < \log_b{a} c<logba,那么:
T ( n ) = Θ ( n log b a ) T(n) = \Theta(n^{\log_b{a}}) T(n)=Θ(nlogba) -
情况2:如果 f ( n ) = Θ ( n c ) f(n) = \Theta(n^c) f(n)=Θ(nc) 其中 c = log b a c = \log_b{a} c=logba,那么:
T ( n ) = Θ ( n c log n ) = Θ ( n log b a log n ) T(n) = \Theta(n^c \log n) = \Theta(n^{\log_b{a}} \log n) T(n)=Θ(nclogn)=Θ(nlogbalogn) -
情况3:如果 f ( n ) = Ω ( n c ) f(n) = \Omega(n^c) f(n)=Ω(nc) 其中 c > log b a c > \log_b{a} c>logba,并且对于某个常数 ϵ > 0 \epsilon > 0 ϵ>0,有 a f ( n b ) ≤ k f ( n ) af\left(\frac{n}{b}\right) \leq kf(n) af(bn)≤kf(n) 对于足够大的 n n n 成立,其中 k < 1 k < 1 k<1,那么:
T ( n ) = Θ ( f ( n ) ) T(n) = \Theta(f(n)) T(n)=Θ(f(n))
上面所说的情况其实很简单,计算出来分解子问题的时间复杂度后,将其与合并子问题的时间复杂度进行比较。
如果合并子问题的时间复杂度,即
f
(
n
)
f(n)
f(n),更高,即为情况一
,最终的时间复杂度直接取
f
(
n
)
f(n)
f(n)
等于,即为情况二
,最终的时间复杂度为
O
(
f
(
n
)
∗
log
n
)
O(f(n) * \log n)
O(f(n)∗logn)
如果计算分解子问题的时间复杂度高,即为情况三
。最终的时间复杂度为
O
(
n
log
b
a
)
O(n^{\log_b a})
O(nlogba)
例子
假设我们有一个递归关系:
T
(
n
)
=
2
T
(
n
2
)
+
n
T(n) = 2T\left(\frac{n}{2}\right) + n
T(n)=2T(2n)+n
我们来分析这个递归关系:
- a = 2 a = 2 a=2
- b = 2 b = 2 b=2
- f ( n ) = n f(n) = n f(n)=n
计算
log
b
a
\log_b{a}
logba:
log
2
2
=
1
\log_2{2} = 1
log22=1
现在比较 f ( n ) f(n) f(n) 和 n log b a n^{\log_b{a}} nlogba:
- f ( n ) = n f(n) = n f(n)=n
- n log 2 2 = n 1 = n n^{\log_2{2}} = n^1 = n nlog22=n1=n
这属于主定理的情况2,因为
f
(
n
)
f(n)
f(n) 和
n
log
b
a
n^{\log_b{a}}
nlogba 是相等的。因此:
T
(
n
)
=
Θ
(
n
log
n
)
T(n) = \Theta(n \log n)
T(n)=Θ(nlogn)
例子2
T
(
n
)
=
T
(
2
n
3
)
+
1
T(n) = T(\frac {2n}3) + 1
T(n)=T(32n)+1
分析
a = 1, b = 3/2, f(n) = 1
l
o
g
3
2
1
=
0
log_{\frac{3}2}{1} = 0
log231=0 ,所以
O
(
n
0
)
=
O
(
1
)
O(n^0) = O(1)
O(n0)=O(1),
也即二者相等,情况二,所以最终时间复杂度:
T
(
n
)
=
O
(
1
∗
l
o
g
n
)
=
O
(
l
o
g
n
)
T(n) = O(1 * log n) = O(logn)
T(n)=O(1∗logn)=O(logn)