Skip to content
难度基础(★)
建议时长45分钟

14.2.2 时间复杂度与空间复杂度-02

本节把复杂度推进到递归式。课程重点不是要求你掌握所有递归求解技巧,而是认识主定理适用的形式,并会对常见增长阶做比较。

递归式形式

典型分治递归式:

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

其中:

符号含义
a子问题个数
n/b每个子问题规模
f(n)分解和合并等额外工作

主定理只适用于这种“规模按比例缩小”的形式。若是 T(n)=T(n1)+...,不能直接套主定理。

主定理的比较核心

比较 f(n) 与:

nlogba

如果 f(n) 更小,复杂度主要由递归子问题决定;如果同阶,会多一个 logn;如果 f(n) 更大且满足正则条件,复杂度主要由 f(n) 决定。

例:T(n)=8T(n/2)+n2

这里 a=8,b=2,f(n)=n2

nlogba=nlog28=n3

因为 n2 小于 n3,所以:

T(n)=O(n3)

复杂度比较题

比较增长阶时,先把常数去掉,再按增长序排:

logn<n2/3<n<n4<2n<n!

课程例题中 1000n 的量级仍然是 O(n),不会因为系数 1000 就超过 n2

空间复杂度补充

递归除了时间成本,还有调用栈空间。若递归深度为 h,每层只用常量辅助变量,则栈空间约为 O(h)。例如二分递归深度是 O(logn),单支递归深度可能是 O(n)

本节例题

单选
递归式 $T(n)=8T(n/2)+n^2$ 的时间复杂度为:

自查清单

  1. 能否判断主定理是否适用于某个递归式?
  2. 能否计算 nlogba 并与 f(n) 比较?
  3. 能否解释为什么递归调用栈也会占用空间?