5.递归的时间复杂度

代入法

递归时间复杂度的计算可以通过代入法来理解和求解。代入法的基本思路是通过假设递归算法的时间复杂度,并利用递归方程进行求解和验证(一般采用数学归纳法证明)

  • 假设递归算法的时间复杂度:
    假设递归算法的时间复杂度为 T ( n ) T(n) T(n),这里 n n n 通常代表问题的规模或大小
  • 用数学归纳法确定 T ( n ) T(n) T(n) 的形式,解出其中的常数并证明解是正确的

代入法的证明可参考:链接到知乎

递归树

将递归问题图表化,每个结点表示一个单一子问题的代价,子问题对应某次递归函数的调用。将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价

绘制递归树求解递归时间复杂度时需要仔细考虑以下注意事项:

  1. 递归关系式的准确性:
    确保递归关系式(recurrence relation)准确地反映了算法的递归结构。递归关系式应该正确地描述问题规模的分解和子问题的求解方式。任何错误或遗漏都可能导致对时间复杂度的错误推导
  2. 递归树的绘制正确性:
    绘制递归树时,确保每一层的节点规模和工作量都按照递归关系式正确地分解和计算
  3. 节点工作量的计算:
    每个节点的工作量应该准确反映了除了递归调用外的其他操作量。这通常由递归关系式中的 f(n) 决定,表示每个节点除了递归调用以外的工作量
  4. 递归树的层次和总结构:
    理解递归树的层次结构和总体形状对正确分析时间复杂度至关重要。每一层的节点数量和工作量都会影响递归树的总体工作量,从而决定算法的时间复杂度
  5. 递归树的求解和总工作量计算:
    在绘制递归树后,要进行适当的求解和计算,以得出算法的总体工作量。通常需要对每一层的节点数和工作量进行求和,然后根据求解结果来推导出时间复杂度的表达式
  6. 边界条件和基本情况:
    在递归算法中,需要考虑边界条件和递归基本情况。这些条件决定了递归树的终止条件和最底层的节点规模,对于推导时间复杂度和绘制递归树时至关重要

递归树绘制求解示例

对递归式 T ( n ) = 3 T ( n / 4 ) + Θ ( n 2 ) T(n) = 3T(n/4) + Θ(n²) T(n)=3T(n/4)+Θ(n2)

在这里插入图片描述

将树中所有结点的代价累计起来,就得到了当前递归式的解
在这里插入图片描述

主方法

基于递归关系式的形式,快速判断递归算法时间复杂度的方法
递归关系式一般形式为 T ( n ) = a ( n / b ) + f ( n ) T(n) = a(n/b) + f(n) T(n)=a(n/b)+f(n)
其中:

  • T(n) 是问题规模为 𝑛 时的函数(即递归算法的时间复杂度)
  • a 是递归发生时的子问题个数
  • n/b 是每个子问题的规模
  • f(n) 是除了递归调用外的其他工作量,通常表示对问题的分解和合并操作的时间复杂度

主方法的三种情况

  1. 如果 f ( n ) = O ( n l o g b a − ε ) f(n) = O(n^{log_b{a-\varepsilon}}) f(n)=O(nlogbaε) (其中 ε > 0 \varepsilon > 0 ε>0 ), 则 T ( n ) = Θ ( n l o g b a ) T(n) = \Theta(n^{log_b{a}}) T(n)=Θ(nlogba)
  2. 如果 f ( n ) = O ( n l o g b a ) f(n) = O(n^{log_b{a}}) f(n)=O(nlogba) , 则 T ( n ) = Θ ( n l o g b a l o g n ) T(n) = \Theta(n^{log_b{a}}logn) T(n)=Θ(nlogbalogn)
  3. 如果 f ( n ) = O ( n l o g b a + ε ) f(n) = O(n^{log_b{a+\varepsilon}}) f(n)=O(nlogba+ε) (其中 ε > 0 \varepsilon > 0 ε>0 ), 且满足正则条件则 T ( n ) = Θ ( n ) T(n) = \Theta(n) T(n)=Θ(n)

正则条件指的是 𝑎𝑓(𝑛/𝑏) ≤ 𝑐𝑓(𝑛) 对某个常数 c<1 成立,其中 𝑓(𝑛) 是递归关系式中的非递归部分。这个条件用于确保递归树中递归调用的规模总和不超过当前层的工作量,从而保证主方法的有效性

使用示例

对于递归关系式 T ( n ) = 3 T ( n / 4 ) + Θ ( n 2 ) T(n) = 3T(n/4) + Θ(n²) T(n)=3T(n/4)+Θ(n2):

  • a = 3 a=3 a=3
  • b = 4 b=4 b=4
  • f ( n ) = n 2 f(n) = n^2 f(n)=n2

则有比较: f ( n ) 和 n l o g b a = n l o g 4 3 f(n) 和 n^{log_ba} = n^{log_43} f(n)nlogba=nlog43 的关系,
l o g 4 3 ≈ 1.26 < 2 log_43≈1.26 < 2 log431.26<2
f ( n ) = n 2 = O ( n l o g 4 3 − ε ) f(n) = n^2 = O(n^{log_43-\varepsilon}) f(n)=n2=O(nlog43ε) (其中 ε > 0 \varepsilon > 0 ε>0), 属于第一种情况。
^{log_43-\varepsilon})$ (其中 ε > 0 \varepsilon > 0 ε>0), 属于第一种情况。
根据主方法即可得到结论: T ( n ) = Θ ( n l o g 4 3 ) T(n) = \Theta(n^{log_43}) T(n)=Θ(nlog43)

  • 52
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值