转载/借鉴于:
- 从主方法到 Akra-Bazzi 定理
- 递归式求解——代入法、递归树与主定理
- 复杂度 - OI-wiki
Start up
首先需要知道递归法求 时间复杂度 T(n)
最朴素的情况是 T(n)=aT(bn)+r(n);(a,b>0)(这里使用 r
而非 f
是因为我把渐进成本理解为每层递归的余子项 )
前置
e.g. T(n)=3T(4n)+Θ(n2)
我们先来看最简单的情况:
(c 是常数)

这里 cn2 是当前阶段的渐进成本
然后下面的三个 T(4n) 则是转移成本
这里不难看出 将这颗树的所有节点的值加起来就是 T(n)
如此这般, 将 下面的节点也拆掉
就得到了最终图

树高
设当前迭代到第 k 层
每一层都是一次迭代, 我们当然是要最终迭代到 T(1) 的
那么, 在 k 到最后一层时有 bkn=1⇒k=logbn
叶子节点数量
每次迭代, 转移的数量都是 a
也就是说 最后一层是 ak⇒alogbn
这里我们用对数的性质可以得到: alogbn=nlogba
证明
首先证明: alogan=n(将指数拆为对数形式易得)
alogbn=blogb(alogbn)=blogbn⋅logba=blogba⋅logbn=blogb(nlogba)=nlogba
总成本
这个比较复杂, 我们先列出公式(从递归图得来, 最后一层+其他层)
T(n)=aT(bn)+r(n);(a,b>0)=Θ(nlogba)+k=0∑logbn−1akr(bkn)
记
V(n)R(n)=nlogba=k=0∑logbn−1akr(bkn)
此时 V(n) 和 R(n) 的大小共同决定了 T(n), 而 V(n) 是确定的, 比较简单, 我们主要来研究 R(n)
注意: 以下 logba−ϵ=logb(a)−ϵ
分类讨论:
T(n)=⎩⎨⎧Θ(nlogba)Θ(r(n))Θ(nlogbalogp+1n)r(n)=O(nlogba−ϵ),ϵ≥0r(n)=Ω(nlogba+ϵ),ϵ≥0, 0<c<1, n>N, ar(bn)≤cr(n)r(n)=Θ(nlogbalogpn),k≥0
性质一
r(n)=O(nlogba−ϵ),ϵ>0
证明
以下在非关键部分省略 ∑ 的参数
R(n)R(n)=∑akr(bkn)≤∑ak⋅(bkn)logba−ϵ=nlogba−ϵ⋅∑(blogba−ϵa)k=nlogba−ϵ⋅∑(blogbaabϵ)k=nlogba−ϵ⋅k=0∑logbn−1bkϵ=nlogba−ϵ⋅bϵ−1nϵ−1=nlogba⋅bϵ−11−nϵ1=O(nlogba)
性质三
r(n)=Θ(nlogbalogpn),k≥0
证明
其实第三种情况和第一种是完全共通的
和性质一证明方法相同带入计算化简, 最终可以得到 R(n)=nlogbalogknlogbn−Δ, Δ 为负数, 我们直接忽略, 然后换底公式, 将换出来的底当作系数, 再乘即可得到最终结果
性质二
r(n)=Ω(nlogba+ϵ),ϵ≥0, 0<c<1, n>N, ar(bn)≤cr(n)
证明
首先 R(n)=Ω(r(n)),又因为 ar(bn)≤cr(n),只要 c 的取值是一个足够小的正数,且 n 的取值足够大,因此可以推导出:R(n)=O(r(n))。两侧夹逼可以得出,R(n)=Θ(r(n))。
首先, R(n)=∑k=0logbn−1akr(bkn)=r(n)+∑k=1logbn−1akr(bkn)=Ω(r(n))
然后, 每层转移都满足 ar(bn)≤cr(n)
即 akr(bkn)≤ckr(n)
放缩, 合并, 等比数列求和, 有
R(n)R(n)≤r(n)⋅k=0∑logbn−1ck≤r(n)⋅k=0∑+∞ck=r(n)⋅1−c1−c+∞=r(n)⋅1−c1=O(r(n))
夹逼定理可得到 R(n)=Θ(r(n))
应用
很多时候三个情况都可以使用, 具体问题具体分析了
例1
T(n)=T(2n)+1
答案
这里 logba=0, 可以用第三情况得出 T(n)=n0logb1a
当然也可以看作 ϵ=0 的第一情况得出
例2
T(n)=T(2n)+n
答案
这里 logba=0, 而 r(n)=n1=n0, 显然不能用第三种情况, 显然只能用第二种情况, 得出 T(n)=n
例3
T(n)=25T(52n)+nlog22n
答案
这里 logba=1, 显然是第三种情况, 得出 T(n)=nlog23n
例4
T(n)=3T(4n)+nlog2n
答案
这里 logba=log43<1 (而且后面带了个尾巴 log2n), 显然用第二种 显然用第二种, 得出 T(n)=nlog2n