非递归算法的时间复杂度可以通过找到执行次数最多的代码,计算其执行次数即可。但是递归算法的时间复杂度则无法通过这种方式求得。有一种最简单的求递归算法的方式,即利用递推方法求解时间复杂度。如下所示:

这种方法求时间复杂度很简单,但是可以如此简单的使用这种方法的情况很少,往往需要比较复杂的公式推导。因此利用这种方法求时间复杂度比较困难,需要利用别的方式进行求导。主要是以下两种方式:主定理递推树

1.主定理

递归算法的时间复杂度定义一般有如下形式:

在大部分情况下,可以通过主定理,求解该问题的时间复杂度。
注:要求 a大于等于1,b大于1,且f(n)为正函数。

计算步骤


其中,规则1,2是比较简单就可以计算出来的,规则3则比较复杂。

例题1


通过计算可得:

而f(n)的时间复杂度为O(1)=O(n^(2-2)),也就是说

符合第一种情况,则

例题2


通过计算可得:

而f(n)的时间复杂度为O(n)=O(n),也就是说,二者相等。

符合第二种情况,则

例题3

通过计算可得:

这种情况则应该套用规则三,

根据主定理的第三种规则,时间复杂度为:

反例

主定理求解的步骤不是很复杂,大部分的情况利用该定理可以得到解决,但是也有无法解决的情况:

由于这种情况,单纯的使用主定理已经无法解决了,因此引入递归树的求解方法。

递归树

基本原理如下所示:

递归树求解递归算法的时间复杂度,没有无法求解的情况,可能有的情况下求解时间复杂度很复杂,但是本质上都是可以求得的。

例题1


这种情况比较简单,但是里面有一个比较容易混淆的地方,在第二行的n/2,代表着数据量为n/2时,时间复杂度为n/2。这里代表的是时间复杂度,而不是数据量 。看下面这个例子,

在第二层,分出了4个枝杈,这代表着表达式中的4。但是这4个枝杈,左边的两个代表 第一个n/2的,右边的两个代表第二个n/2的。简而言之,递归树的层数,需要看T()的括号里面,而每一层的分支数,则需要看C*T()中的C。

例题2


这是主定理无法解决的那种情况,我们通过递归树来求一下。结果如下所示:

努力加油a啊

基于主定理以及递推树求解递归算法的时间复杂度相关推荐

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

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

  2. 递归树求解递归算法的时间复杂度

    递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2)  ...

  3. 【组合数学】递推方程 ( 无重根递推方程求解实例 | 无重根下递推方程求解完整过程 )

    文章目录 一.斐波那契数列求解 二.无重根下递推方程求解完整过程 一.斐波那契数列求解 1 . 斐波那契数列示例 : ( 1 ) 斐波那契数列 : 1,1,2,3,5,8,13,⋯1 , 1 , 2 ...

  4. 【数字信号处理】线性常系数差分方程 ( 使用递推解法求解 “ 线性常系数差分方程 “ | “ 线性常系数差分方程 “ 初始条件的重要性 )

    文章目录 一.使用递推解法求解 " 线性常系数差分方程 " 二." 线性常系数差分方程 " 初始条件的重要性 一.使用递推解法求解 " 线性常系数差分 ...

  5. [递推式求解、多指针、前缀和]XATU第七届算法大赛

    文章目录 赛后感想 1.2题略 3 乐华水上梦幻乐园之拖鞋失踪案[概率论.递推式求解] 题意 分析 代码 4.5.6.7.8题略 9 Ugly Number[多指针] 题意 做法1[BFS with ...

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

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

  7. 【组合数学】递推方程 ( 常系数线性非齐次递推方程求解 | 递推方程标准型及通解 | 递推方程通解证明 )

    文章目录 一.递推方程标准型及通解 二.递推方程通解证明 一.递推方程标准型及通解 H(n)−a1H(n−1)−⋯−akH(n−k)=f(n)H(n) - a_1H(n-1) - \cdots - a ...

  8. 斐波拉契数列的递推递归求解算法

    介绍: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数 ...

  9. 最短线性递推式求解与有理函数重建

    这一算法来自于我们对"线性递推式拟合"的视角转换,其后得到的算法是自然的. 引理 1. 如果两个有理分式 p1/q1,p2/q2p_1/q_1, p_2/q_2p1​/q1​,p2 ...

最新文章

  1. java double转换符_java中字符串怎么转换成double类型
  2. traceback异常打印
  3. 2021年技术人员的最佳Linux桌面前5名
  4. 母亲,我怎么让你等了那么久(转载)
  5. spring和hibernate整合的几种方式详细介绍
  6. Microsoft SQL server 2000 安装挂起 mssql 2000 挂起无法安装的问题
  7. 用Unity3D实现可展开公告版
  8. Java多线程-新特性-线程池
  9. Python 中的range,以及numpy包中的arange函数
  10. Oracle 行转列pivot 、列转行unpivot 的Sql语句总结
  11. 如何修复Win11上的时钟不同步?Win11时钟不同步修复方法
  12. android java 图形_java – 在Android中呈现的图像上的锯齿状边缘
  13. 2021年最优秀的新闻APP或许是这两个(国内没上架)
  14. Linux用户和组权限管理
  15. java模拟魔兽世界武器掉落
  16. 《影响力》(你为什么会说“是”?)读书
  17. 2016年中国智能手机市场发展趋势研究
  18. 阿里旺旺输入框内光标排在右侧,想让其排在左侧解决办法
  19. 服务器系统不打补丁,windows系统打补丁导致系统起不来处理
  20. 图画日记怎么画_图画日记怎么画_二年级下册绘画日记图片

热门文章

  1. Ae/Pr/FCPX抠图插件:Primatte Keyer Mac大大提高工作效率
  2. 网站标题设置优化方法
  3. 大数据舆情传播演变规律如何分析的方法技巧
  4. 三代组装软件Canu使用
  5. 关于应用~试玩,你想知道的都在这儿了----超详细总结(上篇)
  6. 嵌入式学习:裸机开发_L4_官方SDK开发LED实验
  7. 常微分方程组之龙格-库塔法
  8. CSS 背景图像 background-image属性
  9. LATEX 罗马数字的输入
  10. Maven第6篇:生命周期 插件