主定理(Master Theorem)是用于分析分治算法复杂度的重要定理。
前置知识
渐进符号的概念
1. Θ(紧确渐进界)
若存在正常数
c1,c2,n0 使得
∀n≥n0 都有:
0≤c1⋅g(n)≤f(n)≤c2⋅g(n)
则记
f(n)=Θ(g(n))。
Θ 是等价关系,表示
f,g 增长速度同阶,类似
=。
2. O(渐进上界)
若存在正常数
c,n0 使得
∀n≥n0 都有:
0≤f(n)≤c⋅g(n)
则记
f(n)=O(g(n))。
O 是拟序关系,类似
≤(小于等于)。
3. Ω(渐进下界)
若存在正常数
c,n0 使得
∀n≥n0 都有:
0≤c⋅g(n)≤f(n)
则记
f(n)=Ω(g(n))。
Ω 也是拟序关系,类似
≥(大于等于)。
三者如下图所示。
常用性质
- f(n)=Θ(g(n))⇔f(n)=O(g(n))∧f(n)=Ω(g(n))
- f(n)=Θ(f(n))
- c⋅Θ(f(n))=Θ(f(n))(c>0 且 c 与 n 无关)
- Θ(f(n))+Θ(g(n))=Θ(f(n)+g(n))=Θ(max(f(n),g(n)))
- Θ(f(n))Θ(g(n))=Θ(f(n)g(n))
- Θ(logbn)=Θ(log2n)(b>1)
性质 2~6 同样适用于 O 和 Ω。
这些性质会在后面的证明中用到。
主定理简化版
设
T(n) 为分治算法处理规模为
n 的问题的复杂度,且满足:
T(n)={aT(bn)+Θ(nd)Θ(1)ifn≥bifn<b
其中:
- a:子问题个数(a∈Z,a≥1)。
- bn:每个子问题大小(b∈R,b>1)。
- Θ(nd):合并子问题的解得到原问题解的额外复杂度(d≥0)。
则有:
T(n)=⎩⎨⎧Θ(nlogba)Θ(ndlogn)Θ(nd)ifd<logbaifd=logbaifd>logba
Θ 也可以替换成
O,Ω。
这对于 OI 来说已经够用了。
例子
- 对于归并排序,a=2,b=2,d=1,有 d=logba,因此时间复杂度为 Θ(nlogn)。
- 对于 a=2,b=2,d=2 的完全二叉树上背包问题,有 d>logba,因此时间复杂度为 Θ(n2)。
证明
不失一般性地,假设
n 是
b 的整数次幂。
考虑递归树。若根节点算一层,则树高为
logbn+1。单独计算叶子节点,展开得:
T(n)=Θ(alogbn)+k=0∑logbn−1ak⋅Θ((bkn)d)=Θ(alogbn)+k=0∑logbn−1Θ(ak)⋅Θ((bkn)d)=Θ(nlogba)+k=0∑logbn−1Θ(ak⋅(bd)knd)=Θ(nlogba)+k=0∑logbn−1Θ((bda)k⋅nd)=Θ(nlogba)+Θk=0∑logbn−1(bda)k⋅nd=Θ(nlogba)+Θnd⋅k=0∑logbn−1(bda)k
设
p=bda,则:
⎩⎨⎧p>1p=10<p<1ifd<logbaifd=logbaifd>logba
且
T(n)=Θ(nlogba)+Θnd⋅k=0∑logbn−1pk
情况 1(d<logba)
由等比数列求和公式,得:
T(n)=Θ(nlogba)+Θ(nd⋅p−1plogbn−1)=Θ(nlogba)+Θ(nd⋅(plogbn−1))=Θ(nlogba)+Θ(nd⋅((bda)logbn−1))=Θ(nlogba)+Θ(nd⋅(bdlogbnalogbn−1))=Θ(nlogba)+Θ(nd⋅(ndnlogba−1))=Θ(nlogba)+Θ(nlogba−nd)=Θ(nlogba)
情况 2(d=logba)
T(n)=Θ(nlogba)+Θ(nd⋅logbn)=Θ(nlogba)+Θ(ndlogn)=Θ(ndlogn)
情况 3(d>logba)
由等比数列求和公式,得:
T(n)=Θ(nlogba)+Θ(nd⋅p−1plogbn−1)=Θ(nlogba)+Θ(nd⋅1−p1−plogbn)=Θ(nlogba)+Θ(nd)⋅Θ(1)=Θ(nd)
注意
p−1<0,故应将分母化为
1−p。
对于
O,Ω,证明同理。
证毕。
主定理完整版
Θ(nd) 被换成了更一般的
f(n)。
T(n)=aT(bn)+f(n)(n≥b)
则有:
T(n)=⎩⎨⎧Θ(nlogba)Θ(f(n))Θ(nlogbalogk+1n)iff(n)=O(nlogba−ϵ)iff(n)=Ω(nlogba+ϵ)iff(n)=Θ(nlogbalogkn)
其中
ϵ>0,k≥0。
注意其中第二条还必须满足正则条件(Regularity Condition),即存在正常数
c<1,n0 使得
∀n≥n0 都有
af(bn)≤cf(n)。
证明比较繁琐,这里不作展开。思路大致就是代入关于
f(n) 的渐进符号然后化简。
Update 2026.2.1:优化几处格式。