主定理
主定理 (Master Theorem) 是算法分析领域中,用于求解分治策略(Divide and Conquer)递归关系式渐近界的最强力工具。它最早在 《算法导论》(Introduction to Algorithms, CLRS) 中被系统化阐述。
1. 标准递归形式
主定理适用于求解以下形式的递归关系式:
T(n)=aT(n/b)+f(n)
其中:
- n :问题的规模。
- T(n) :解决规模为 n 的问题所需的时间/计算量。
- a≥1 :子问题的数量(必须是常数)。或者说是每次递归拆分出的问题的个数。
- b>1 :子问题规模缩减的因子(必须是常数)。
- bn :每个子问题的规模,通常是原问题的 b1
- f(n) :当前层(递归之外)所做的工作,包括划分问题和合并结果的代价(必须是渐近正函数)。
注 :严格来说,T(n/b) 可以是 T(⌊n/b⌋) 或 T(⌈n/b⌉),但这不会影响渐近时间复杂度分析的结果。
2. 递归计算量
递归到底时,也就是到了第 k 层的时候,子问题的个数为 ak ,每个问题的规模是 bkn 。
又由于递归到底时,子问题的规模为 1,所以令 bkn=1 得 k=logbn 。
子问题的个数,同时也是第 k 层叶子节点的数量:ak=alogbn 。为了方便与额外计算量 f(n) 进行比较,利用对数恒等式将其转化为 ak=alogbn=nlogba ( alogbn=blogbalogbn=blogbn⋅logba=(blogbn)logba=nlogba )
通常,叶子节点的计算量为 Θ(1) ,所以整个递归树的叶子部分的总计算量为 Θ(nlogba) 。
3. 核心思想:比较 f(n) 与 nlogba
主定理的核心在于比较两个函数的增长速率:
- f(n) :递归树“根节点”的工作量(也代表每一层非递归工作的趋势)。
- nlogba :递归树“叶子节点”的总数量(或者说叶子层的总工作量)。
我们将 nlogba 视为临界函数。根据 f(n) 与该临界函数的大小关系,分为三种情况。
4. 三种情况 (The Three Cases)
所用概念解释:f(n) 多项式地小于/大于 g(n) 意味着两个函数的差距必须足够大,大到一个 nϵ 的程度
情况 1:叶子节点占主导 (Heavy Leaves)
如果 f(n) 的增长速率多项式地小于 nlogba,即存在常数 ϵ>0,使得:
f(n)=O(nlogba−ϵ)
那么,递归树叶子层的工作量决定了总复杂度:
T(n)=Θ(nlogba)
情况 2:权重平衡 (Balanced)
如果 f(n) 的增长速率与 nlogba 相当(通常只差一个对数因子),即:
f(n)=Θ(nlogbalogkn)
其中 k≥0(最常见的是 k=0)。那么,总复杂度为:
T(n)=Θ(nlogbalogk+1n)
特例:当 k=0 时(即 f(n)=Θ(nlogba)),T(n)=Θ(nlogbalogn)。这也是归并排序的情况。
情况 3:根节点占主导 (Heavy Root)
如果 f(n) 的增长速率多项式地大于 nlogba,即存在常数 ϵ>0,使得:
f(n)=Ω(nlogba+ϵ)
且 满足 正则性条件 (Regularity Condition) :存在常数 c<1 和足够大的 n,使得:
af(n/b)≤cf(n)
那么,递归树根节点的工作量决定了总复杂度:
T(n)=Θ(f(n))
5 关键细节解析
必须强调以下两点:
-
多项式差异 (Polynomially Larger/Smaller) :
在情况 1 和情况 3 中,仅仅“大”或“小”是不够的(例如 logn 的差异),必须相差一个 nϵ 因子。
- 错误示例:nlogba=n,而 f(n)=nlogn。虽然 f(n) 更大,但不是多项式地大(logn 小于任何 nϵ)。因此不适用情况 3(也不适用情况 2)。
-
正则性条件 :
在情况 3 中,正则性条件通常在 f(n) 是多项式函数时自然成立(如 n2,n3),不能是分段函数,不能是震荡函数。但在极少数数学构造的函数中可能失效。如果失效,主定理不适用。
6. 实例分析
示例 A:T(n)=9T(n/3)+n
- a=9,b=3,f(n)=n
- 计算临界指数:logba=log39=2
- 临界函数:nlogba=n2
- 比较:f(n)=n1。显然 n1 比 n2 多项式地小(ϵ=1)。
- 结论 (情况 1) :T(n)=Θ(n2)
示例 B:T(n)=T(2n/3)+1
- a=1,b=3/2,f(n)=1
- 计算临界指数:log3/21=0
- 临界函数:n0=1
- 比较:f(n)=1=Θ(n0)。两者相等。
- 结论 (情况 2, k=0) :T(n)=Θ(n0logn)=Θ(logn)
示例 C:T(n)=3T(n/4)+nlogn
- a=3,b=4,f(n)=nlogn
- 计算临界指数:log43≈0.792
- 临界函数:n0.792
- 比较:f(n)=n1logn。由于 1>0.792,且 nlogn 比 n0.792 多项式地大(ϵ≈0.2)。
- 检查正则性条件:3(n/4log(n/4))≤c(nlogn),即 0.75nlogn≤cnlogn,取 c=0.75 成立。
- 结论 (情况 3) :T(n)=Θ(nlogn)
7. 主定理失效的场景 (Gaps)
主定理并未覆盖所有可能的情况。以下情况不能使用主定理:
-
非多项式差异 :
f(n) 处于 nlogba 和 nlogba±ϵ 之间。
例如:T(n)=2T(n/2)+nlogn。
这里 logba=1,临界函数是 n。f(n)=nlogn 比 n 大,但并非多项式地大(只差 logn)。这落入了情况 2 和情况 3 的缝隙中。
注:对于这种特定情况,可以使用扩展主定理求解,结果为 O(nlog2n)。
-
正则性条件不满足 :
f(n) 虽然很大,但不是单调递增或波动剧烈(如涉及 sinn 等函数)。
-
a 或 b 不是常数 :
例如 T(n)=T(n−1)+n 或 T(n)=nT(n)+n。