递归方程

递归方程之前提到过,就是部分算法在求解的过程中使用了将一个问题划分成几个等价的小问题,在这个过程中,我们就可以列出一个等式。
(如归并排序中,将一个大数组拆分成两个小数组分别计算,然后用O(n)的代价合并,
T(n) = T(n/2)+O(n)就是一个递归方程)

那么,在得到一个递归方程之后,我们应该如何求解问题呢?

替换法/代入法

我们都知道,归并排序的时间复杂度为O(nlogn),那么我们以后看到和上面给出的归并排序差不多的递归方程时,我们可能心中就有了一些猜想。
没错,这个方式就是通过经验经行猜测
比如T(n) = 2T(n/2 + 17) + n,因为我们之前说过时间复杂度这个东西和常数项等关系不大,所以我们自然会将其和nlog进行联系,那么此时我们就需要带入,进行验证。

需要注意,在使用数学归纳法的时候,我们是可以舍弃前几项的
因为算法的时间复杂度并非严格的数学计算,我们可以忽略很多东西,而且在θ等标记符的定义过程中我们也强调了n0的含义。

但是,猜也是需要积累经验的,对一些奇怪的问题我们可能很难做到一次猜对,很自然,我们可以考虑先猜一个上下阶,然后不断逼近的方式。
那么我们就需要一些常见的时间复杂度的大小比较:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3)……随后是指数,阶乘函数是最大的。
需要注意的问题:

  • 任意底数的logn都要比多项式低阶
  • 不同底数的log是同阶的,只相差一个系数(换底公式)

随后是一个蛮奇怪的问题,就是在计算下面的时间复杂度时,我们的做法可能有一点不同

我们可以通过猜测的方式,达到O(n)的程度,但是当将O(n)带入时,会发现:

此时我们最可能的想法就是要计算O(nlogn)了,因为低阶的已经不能证明了。
但正好相反,我们的做法是在原来的基础上减去一个常数项

这是因为等式距离cn只差了一个常数项,而递归方程的左边只有一个T函数,而右边则有两个,那么在用右边的式子代替左边时,我们就可以减去双倍的常数项,就可以保证等式成立了。

等等,还有一种比较常见的变型:
有时我们会遇见一些奇形怪状的问题,比如
那么此时就要想一下是否能通过变脸替换来解决问题了。

递归树法

这个方法是非常有趣的,也是最接近所有方法的本质的。

T(n) = 3T(n/4)+θ(n2)

我们可以这样想象,首先我们有一个大小为n的原问题,然后我们将他拆分成三个n/4大小的子问题,然后用了θ(n2)的代价。
将θ(n2)写在树根,那么这个根节点就应该有3个孩子节点,每一个孩子节点的大小是n/4

当我们将这个过程继续下去,直到最后一层,每一个结点的大小都是T(1)时
( T(1)的代价我们默认为O(1) ),我们就可以说这棵树到了叶子节点。
因为每一层我们都将原规模缩小为原来的1/4,然后每一层的个数都是原来的三倍,所以最后一层的叶子节点个数应为3log4n
使用换底公式,我们可以得到最后一层的代价为θ(nlog43)。(以4为底3的对数)

而每一次的拆分,我们都将代价写在非叶子结点上,那么将代价相加,
再加上最后的叶子节点代价,我们就可以得到整体的代价了。
(说白了就是我把所有代价都写在结点上了,叶子节点就是T(1) == θ(1),你把所有的加起来就行了)

(学校ppt上的照片有水印,自己做的将就一下吧T_T)

在得到了每一层的代价之后,求和就是高数的事了。

主方法(最简单的方式)

好叭,可能很多人都和我一样,高数早就还给了老师,所以大佬们就给出了一个十分简单的方式来计算这类的时间复杂度。
这里给出主方法的一个分析方式,但不属于证明!
在我们计算递归树的时候,如果真的动手去算了上面的代价,那么会发现非叶子节点是一个等比数列,而叶子节点是另外一种不同的计算方式。在之前我们提到过,时间复杂度只考虑最高阶,所以我们只需要比较两者阶的高低,就可以得到时间复杂度了。

主方法通式:T(n) = aT(n/b)+f(n)

非叶子节点:θ( f(n) ) 不管ab怎么样,最后都是f(n)带一串的常数
叶子节点 :同上面的递归树,nlogba(以b为底a的对数)
也就是比较两者的大小了。
声明:这里面的大小需要满足多项式的大于,也就是n和nlogn这样主方法是不成立的

  1. 当f(n) > nlogba 时,有T(n)=θ( f(n) )
  2. 当f(n) < nlogba 时,有T(n)=θ( nlogba )
  3. 当f(n) = nlogba 时,有T(n)=θ( f(n)*logn )

递归方程的求解(代入、递归树和主方法)相关推荐

  1. 【学习笔记】求解简单递归式的一般方法

    [学习笔记]求解简单递归式的一般方法 手动博客搬家: 本文发表于20180618 15:53:06, 原地址https://blog.csdn.net/suncongbo/article/detail ...

  2. 递归树: 如何借助树来求解递归算法的时间复杂度

    ------ 本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 ------ 今天,来讲树这种数据结构的一种特殊的应用,递归树. 我们都知道,递归代码的时间复杂度分析起来很麻烦 ...

  3. 算法分析之-主方法分析递归式

    主方法 在算法分析中,我们主要使用代入法,递归树法,和主方法来分析递归式 而主方法为如下形式的递归式提供了一套"菜谱"式解法: T(n)=aT(nb)+f(n)T(n)=aT(\f ...

  4. 递归树——分析递归算法的时间复杂度

    递归树 递归的思想就是,将大问题分解为小问题来求解,然后再将小问题分解为小小问题. 这样一层一层地分解,直到问题的数据规模被分解得足够小,不用继续递归分解为止. 如果我们把这个一层一层的分解过程画成图 ...

  5. 求解递归方程的方法:递归树法

    示例一 T(n)=2T(n/2)+n-1,求T(n)上界 将每一层的代价求和:(假设k层,k=nlogn) T(n)=kn + n-1 + n-2 + -- + n-2^(k-1) T(n)=kn - ...

  6. 算法导论习题—主方法求渐进紧确界、递归树方法

    算法导论习题-主方法求渐进紧确界.递归树方法 4.5-1 a. T(n)=2T(n/4)+1T ( n ) = 2 T ( n / 4 ) + 1T(n)=2T(n/4)+1 b. T(n)=2T(n ...

  7. 算法导论 — 4.4 用递归树方法求解递归式

    笔记 在应用代入法求解递归式时,需要事先做出一个好的猜测.然而,有时候做出好的猜测是很困难的,此时可以考虑采用递归树方法.在递归树中,每个结点表示一个单一子问题的代价.创建递归树之后,对树的每层的各子 ...

  8. 用递归树方法求解递归式

    用递归树方法求解递归式 [备注:需要修改] 一个递归算法的递归式:T(n)=3T(n/4)+cn2T\left(n\right)=3T\left(n/4\right)+cn^2T(n)=3T(n/4) ...

  9. [数据结构]递归树:借助树求解递归算法的时间复杂度

    文章目录 递归树与时间复杂度分析 实战一:分析快速排序的时间复杂度 实战二:分析斐波那契数列的时间复杂度 实战三:待补充,先学其他的... 递归树与时间复杂度分析 我们前面讲过,递归的思想就是,将大问 ...

最新文章

  1. Science评论:量子计算目前最大的挑战,在0和1之间
  2. hdu2063 二分图(基础题)
  3. java collection join_java – @ElementCollection @CollectionTable在一对多映射中
  4. c++ 读写文本文件
  5. MySQL Sharding DB (基于Fabric)
  6. java tlv格式_java解析TLV格式数据
  7. 滴滴升级“极速拼车”:未拼成可享折扣 拼成更便宜
  8. Python中内置函数的介绍
  9. 借助Docker,在win10下编码,一键在Linux下测试
  10. C# 列表中查找大小比较
  11. TextBox多行输入时,屏蔽回车键
  12. 7-2 数列循环右移 (10 分)
  13. 跟着小马哥学系列之 Spring AOP(Spring 事务(源码分析)上)
  14. yum install docker 安装的是 podman-docker而不是 docker
  15. html的长度单位的选择,html中常见长度单位有哪些?
  16. 星星之火OIer:TunaParetoUnija
  17. 背单词APP调研分析
  18. 系统架构师—软件架构设计(二)CS/BS/SOA/DSSA/ABSD
  19. [UVM]UVM TLM1.0 Interface归纳总结 --- 图解UVM TLM1.0 Interface
  20. Fiddler抓包工具常见功能介绍,还不会的进来看

热门文章

  1. oracle 指定索引
  2. 水滴os 鸿蒙,华为鸿蒙OS强势来袭:2K水滴屏+麒麟985+5500mAh 华为巅峰之作
  3. C++11中type_traits中的基石 - integral_constant
  4. 梦幻西游不显示服务器选项,梦幻西游:祥瑞可以取消显示了,这下服务器不用太卡了...
  5. springmvc如何拦截html页面,SpringMVC实现拦截器
  6. NSISI基本语法---注册表的操作
  7. 人能守住一个永恒吗?
  8. 2020大连西山居暑期实习面经(已OC)
  9. css+html 3D变形制作视频展示区
  10. python中字典del的用法_python中字典(Dictionary)用法实例详解