递推式求解:展开、递归树与主定理

Views: --

递归算法的时间复杂度通常写成“子问题成本 + 当前层成本”。求解递推式的关键不是背答案,而是看清每层有多少子问题、每个多大、当前层做多少额外工作

1. 直接展开

例如

T(n)=T(n1)+n,T(1)=Θ(1).T(n)=T(n-1)+n, \qquad T(1)=\Theta(1).

连续展开:

T(n)=T(1)+2+3++n=Θ(n2).T(n)=T(1)+2+3+\cdots+n=\Theta(n^2).

再如

T(n)=T(n/2)+1,T(n)=T(n/2)+1,

每次规模减半,展开 log2n\log_2n 次后到达 1,所以 T(n)=Θ(logn)T(n)=\Theta(\log n)

直接展开适合单分支递归和容易求和的递推式。

2. 代入法

代入法本质是“先猜答案,再用归纳法证明”。例如猜

T(n)cnlogn.T(n)\le cn\log n.

T(n)=2T(n/2)+nT(n)=2T(n/2)+n

代入归纳假设:

T(n)2cn2logn2+n=cnlogncn+n.T(n) \le2c\frac n2\log\frac n2+n =cn\log n-cn+n.

c1c\ge1 时不超过 cnlogncn\log n,上界成立。再证明同阶下界即可得到 Θ(nlogn)\Theta(n\log n)

若差一个低阶项导致归纳闭合不了,可加强猜想,例如从 cncn 改成 cndcn-d。这不是作弊,而是在给归纳留出“余量”。

3. 递归树

考虑

T(n)=3T(n/4)+cn2.T(n)=3T(n/4)+cn^2.

ii 层有 3i3^i 个规模 n/4in/4^i 的子问题,因此该层非递归成本为

3ic(n4i)2=cn2(316)i.3^i c\left(\frac{n}{4^i}\right)^2 =cn^2\left(\frac{3}{16}\right)^i.

这是收敛几何级数,根层工作占主导,所以 T(n)=Θ(n2)T(n)=\Theta(n^2)

递归树最直观的价值是判断:

  • 每层成本在下降:根层主导;
  • 每层成本相同:层数带来一个 logn\log n
  • 每层成本在上升:叶子层主导。

4. 主定理

T(n)=aT(n/b)+f(n),T(n)=aT(n/b)+f(n),

递归树有 logbn\log_b n 层,叶子数约为

alogbn=nlogba.a^{\log_b n}=n^{\log_ba}.

因此把 f(n)f(n)nlogban^{\log_ba} 比较。

4.1 子问题主导

若存在 ε>0\varepsilon>0,使

f(n)=O(nlogbaε),f(n)=O\left(n^{\log_ba-\varepsilon}\right),

则叶子贡献更大:

T(n)=Θ(nlogba).T(n)=\Theta\left(n^{\log_ba}\right).

4.2 各层同阶

f(n)=Θ(nlogbalogkn),f(n)=\Theta\left(n^{\log_ba}\log^kn\right),

T(n)=Θ(nlogbalogk+1n).T(n)=\Theta\left(n^{\log_ba}\log^{k+1}n\right).

最常见的 k=0k=0 情形就是多乘一个 logn\log n

4.3 根层主导

若存在 ε>0\varepsilon>0,使

f(n)=Ω(nlogba+ε),f(n)=\Omega\left(n^{\log_ba+\varepsilon}\right),

并满足正则条件

af(n/b)cf(n),c<1,af(n/b)\le cf(n),\qquad c<1,

T(n)=Θ(f(n)).T(n)=\Theta(f(n)).

正则条件保证 ff 不会剧烈波动,使根层确实占主导。

5. 典型例题

递推式比较结果
2T(n/2)+n2T(n/2)+nf(n)=nlog22f(n)=n^{\log_2 2}Θ(nlogn)\Theta(n\log n)
4T(n/2)+n4T(n/2)+n叶子规模 n2n^2 更大Θ(n2)\Theta(n^2)
T(n/2)+nT(n/2)+n根层工作更大Θ(n)\Theta(n)
2T(n/2)+nlogn2T(n/2)+n\log n临界项多一个 logn\log nΘ(nlog2n)\Theta(n\log^2n)
7T(n/2)+n27T(n/2)+n^2nlog27n^{\log_2 7} 更大Θ(nlog27)\Theta(n^{\log_2 7})

6. 主定理不能乱套

以下递推式不能直接套标准主定理:

  • T(n)=T(n1)+nT(n)=T(n-1)+n:子问题不是 n/bn/b
  • T(n)=T(n/2)+T(n/4)+nT(n)=T(n/2)+T(n/4)+n:子问题规模不同;
  • T(n)=2nT(n/2)+nT(n)=2^nT(n/2)+naa 不是常数;
  • T(n)=2T(n/2)+nloglognT(n)=2T(n/2)+n\log\log n:不一定落入最基础三种模板。

这时可用展开、递归树、Akra-Bazzi 定理或上下界夹逼。

7. 非等分子问题的递归树

例如

T(n)=T(n/2)+T(n/4)+T(n/8)+n.T(n)=T(n/2)+T(n/4)+T(n/8)+n.

下一层所有子问题规模之和是 7n/87n/8,所以每层总代价按 7/87/8 递减:

n+78n+(78)2n+=Θ(n).n+\frac78n+\left(\frac78\right)^2n+\cdots=\Theta(n).

无需先求出叶子数,也能看出 T(n)=Θ(n)T(n)=\Theta(n)

8. 写答案的规范顺序

  1. 写清基础情形;
  2. 说明采用的方法;
  3. 展示每层代价或主定理参数;
  4. 求和;
  5. Θ\Theta 给出紧确结果。

只写“由主定理得”而不列 a,b,f(n)a,b,f(n),考试时很容易因套错情形丢分。

评论