算法导论复习(五)| 求解递归式

分治法时间复杂度的求解

设开始时,问题的规模为n,之后被分解为两个子问题,子问题的规模分别n1n2
T(n)表示对规模为n时问题求解的时间,则规模分别为n1n2的子问题的求解时间可表示为T(n1)T(n2)

一般地,T(n)T(n1)T(n2)的关系可表示为:T(n) =T(n1)+T(n2)+f(n),其中f(n)是指除子问题递归求解以外的、其它必要处理所花费的时间。

因此,分治算法的计算时间表达式也往往是递归式。
1

三种常用的递归式求解方法:

  • 代换法
  • 递归树法
  • 主方法

代换法

基本思想:
先猜测解的形式,然后用数学归纳法求出解中的常数,并证明解是正确的。
此时,用猜测的解作为归纳假设,在推论证明时作为较小值代入函数,然后证明推论的正确性。
步骤:

  • 猜测解的形式
  • 用数学归纳法求出解中的常数,并证明猜测的正确性

例题:
2
在使用代换法求解递归式时,只需要考虑当n足够大时猜测解的正确性,对于边界条件一般不需要考虑。
化简递归式时,最后T(n)的形式应该与猜测解的形式完全相同。
另一个例题:

证明:T(n)=T(⌈n/2⌉)+1**的解为 O(lgn).

T(n)≤clg(⌈n/2⌉−a)+1
​	≤clg((n+1)/2−a)+1
​	=clg((n+1−2a)/2)+1
​	=clg(n+1−2a)−clg2+1	(c≥1)
​	≤clg(n+1−2a)		(a≥1)
​	≤clg(n−a)

猜测递归式解的一些技巧

3
4
例题:
5
设S(m) = T(2m),得以下形式递归式:S(m)<=2S(m/2)+m

注意:此时右侧余项m不能变为logm,因为对S(m)的代换只是改变了函数的形式,而m本身没有被换元。

6


递归树法

递归树

反应递归的执行过程。每个节点表示一个单一子问题的代价,子问题对应某次递归调用,根节点代表顶层调用的代价,子节点分别代表各层递归调用的代价。

基于递归树的时间分析

  • 节点代价:在递归树中,每个节点有求解相应(子)问题的代价。
  • 层代价:每一层各节点代价之和。
  • 总代价:整棵树的各层代价之和。

利用树的性质,获取对递归式解的猜测,然后用代换法或其它方法加以验证。

例题:
7
T(n)的演化过程:
8扩展直到递归的最底层,得到如下形式的递归树:
9
完全扩展的递归树,高度为log-4-n(共log-4-n+1层)。
10
代价计算
11
12
13

注意:此时获得的T(n)的解只是一个猜测,需要通过代换法进行验证。

14
具体的证明方法和文字描述可以参考《算法导论》52页第5段。


主方法

适用范围

如果递归式有如下形式,在满足一定的条件下,可以用主方法直接给出渐近界:
T ( n ) = a T ( n / b ) + f ( n ) T(n)=aT(n/b)+f(n) T(n)=aT(n/b)+f(n)
其中,a、b是常数,且a≥1,b>1;f(n)是一个渐近正的函数。

主定理

15
考题:
t1
例题:

求解递推关系式𝑇(𝑛) = 16𝑇 (𝑛4) + 𝑛2

解:a=16,b=4,f(n)=n2
logba=2,f(n)=n2=nlogba
∴T(n)=Θ(n2logn)

主方法的失效

16
例题:

17
18

注意上述两种情况的比较。


  • 39
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 时间复杂度的求解取决于实际的算法,一般可以分析算法的执行步骤,统计每个步骤所用的时间,从而求得时间复杂度。对于归式算法,可以通过分析归函数的执行次数,以及每次调用归函数所消耗的时间,来求解时间复杂度。 ### 回答2: 要求解归式的时间复杂度,我们可以按照以下步骤进行: 1. 首先,确定归式的形式。推式通常具有归的特点,即问题的规模需要通过不断缩小来求解。例如,归式可能包含归调用,或者具有归的结构。 2. 其次,推导归式归深度。归的时间复杂度通常与归的深度相关,即需要确定归式归深度。 3. 然后,分析归函数的时间代价。将归式的执行过程分解为不同的子问题,确定每个子问题的时间代价。这可能涉及到归子问题的规模和计算时间。 4. 最后,通过归的时间代价和归式归深度来确定归式的时间复杂度。 需要注意的是,归式的时间复杂度可能与归的规模有关,也可能与归的深度有关,具体取决于具体的情况和问题的性质。同时,归式的时间复杂度也可能需要通过数学推导或归树等方法进行求解。 总的来说,求解归式的时间复杂度需要通过对归的分析、归深度的确定以及归函数的时间代价的分析来进行。 ### 回答3: 求解归式的时间复杂度需要以下步骤: 1. 确定归式的形式:首先,我们需要确定归式的形式和归方程,即描述归的基本操作和归关系的数学等式。这通常需要根据问题的特点和归的实现进行分析。 2. 求解归方程:接下来,我们需要求解归方程,即找到归式的解析解。这可以通过代入法、特征根法或母函数法等数学方法来实现。在这一步骤中,我们可以得到归式的通项公式,并进一步进行化简。 3. 分析归的时间复杂度:一旦我们得到归式的通项公式,我们可以通过分析公式的增长率来确定归的时间复杂度。具体来说,我们可以评估归式中的归调用次数和每次归操作的时间复杂度,然后将它们相乘得到最终的时间复杂度。 4. 解决归的边界条件:最后,我们需要解决归的边界条件,即归的终止条件。这是因为归式只有在满足终止条件时才能收敛,否则归会无限进行下去。在分析时间复杂度时,我们需要考虑归的基本操作在边界条件下的执行次数和时间复杂度。 需要注意的是,求解归式的时间复杂度可能涉及到数学推理和推导,需要运用到数学分析的方法。具体的求解过程会根据不同的归式和问题而有所不同。同时,我们也可以借助工具和数值计算对归式进行近似求解,以便更好地估计时间复杂度的上界和下界。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值