递归算法的时间复杂度分析

在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:

方法一:代换法(代入法)

代换法主要需要以下两个步骤

1、  猜答案,不需要完全猜出来,不需要知道常熟系数的准确值,而只需要猜出它的形式,比如猜一个递归式的时间复杂度大概是O(n2),即它的运行时间应该是一个常熟乘以n2,可能还会有一些低阶项。

猜到答案之后,把答案代入进去,去证明它的确是。


方法二:递归树法

递归树法主要是通过递归树将递归式展开来找到答案,然后再用代换法证明它,因为递归树法是不严谨的。

例如,用递归树法求T(n) = T(n/2) + n2 , 用递归树法将该递归式展开

像这样将递归树展开并延伸下去,最终到叶子节点就只剩下T(1),那么该递归树的高度就是logn,因为从顶点n出发,到n/2,到n/4,……最后到1,那么从n到1的折半次数是logn,即高度是logn(应该是一个常数乘以logn,不过没多大关系)。而最下面叶子节点的数目是n,因为从第一层往下,节点数变化为1,2,4,8……,如果树的高度是h,那么就会有2h个叶节点,而高度是logn,那么2logn=n。那么,整体所做的工作加起来就是T(n)了

T(n) = [1+1/2+1/4+……]n2 = 2n2,于是可知时间复杂度为T(n) = O(n2)。

再例如,用递归树法求T(n) = T(n/4)+T(n/2)+n2 ,下面用递归树的方法将该递归式展开

最后,求叶子节点的数目有点麻烦,因为分支的递归速度是不一样的,左边降低到n/16的时候,右边才降低到n/4,左边子树的高度将会比右边子树的高度要小。可以看到叶子节点的数目必然小于n,因为最开始的问题大小是n,然后递归成一个n/4和n/2的两个子问题,直到最后递归到1停止,而n/4+n/2 < n , 所以最后叶子节点的数目不会超过n,将每层求和就得到T(n),经过观察发现一个等比数列,于是数学归纳法开始派上用场

T(n) = (1+5/16+25/256+……)n2≤2n2 =O(n2)   于是得到该递归式时间复杂度为O(n2),因为是猜出来的等比数列,于是需要用数学归纳法证明之,就又变成方法一中代换法求证了。


方法三:主方法 (master method)

该方法仅适用于特定格式的递归式

同时要求f(n)渐进趋正,即当n->无穷时,f(n)>0。(我觉得上图中第2,3中少了个logn,具体请参考算法导论一书中对时间复杂度的讨论)

例如:

T(n)=4T(n/2)+n , 则a=4,b=2,f(n)=n,计算nlog(b,a)=n2>f(n), 满足模式一,因此T(n) = nlog(b,a)=O(n2)

T(n)=4T(n/2)+n2,则根据上面计算,满足模式二,因此T(n)=O(n2logn)

T(n)=4T(n/2)+n3,满足模式三,T(n)=O(n3)

对于该方法的正确性,可以通过递归树的方法证明,懒的画了,可以在大脑里构思出这样一个草图:

在第一层,f(n)分解为a个子问题,每个子问题都是f(n/b),第二层每个子问题又分解为a个子问题,每个问题都是f(n/b2)……这样递归分解下去,最后的叶子还是O(1),整个树的高度就是log以b为底n的对数,整个的叶子节点数目为a的log以b为底n的对数次方(alog(b,n)),即nlog(b,a)个叶子节点。每个分支的递减速度是一样的,将每层都加在一起便得到T(n) ,此时就需要对f(n)的情况进行讨论(于是就是上面的1,2,3)。

第四种方法:迭代法

T(n) = 3T(n/4) + O(n)
         = O(n) + 3( O(n/4) + 3T(n/42 ) )
         = O(n) + 3( O(n/4) + 3( O(n/42 ) + 3T(n/43 ) ) )······

这样的一种形式就是迭代法的推导形式

递归式的时间复杂度的计算相关推荐

  1. 递归式求时间复杂度的递归树的方法举例说明

    用递归树的时候注意一下递归树的写法规则: (1) 每层的节点为T(n) = kT(n / m) + f(n)中的f(n)在当前的n/m下的值,所以每一层并不是写为T(n / m) , 并且递归树的根节 ...

  2. 递归式求时间复杂度的代入法与迭代法的举例讲解

    在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解.实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方 ...

  3. 【算法导论-主定理】用主方法求解递归式 学练结合版

    问题:若某算法的计算时间表示为递推关系式:T(N)=2T(N/2)+NlogN 且 T(1)=1 则该算法的时间复杂度为( ). O(Nsqrt(N)) O(NlogN) O(N(logN)^2) O ...

  4. 矩阵乘法 递归 优化 c语言,矩阵乘法优化递归式

    序: 在OI比赛中,很多情况下我们可以能通过打表(找规律)或者某些方式发现一个递归式. 例如:f(n) = f(n - 1)+f(n - 2),(斐波那契数列). 通常情况下,我们计算f(n)的时间复 ...

  5. 分治算法中的数学——求解递归式(代入法)

    前言 在运用分治法将原问题分解成多个子问题后,通常可以得到一个关于时间复杂度的递归式,如T(n)=T(n/2)+O(1),如何求解递归式并得出该算法的时间复杂度O(f(n))就是我们要解决的问题.一般 ...

  6. 【算法】2 由股票收益问题再看分治算法和递归式

    回顾分治算法 分治算法的英文名叫做"divide and conquer",它的意思是将一块领土分解为若干块小部分,然后一块块的占领征服,让它们彼此异化.这就是英国人的军事策略,但 ...

  7. 算法时间复杂度的计算:从几道题目讲起

    引子 最近再来回顾一下算法相关的知识,那自然,首先要学习的就是 时间复杂度的概念,以及其计算方式.下面,我就会简单地介绍下时间复杂度,以及会给出几道典型的时间复杂度计算题. 时间复杂度 将算法中基本操 ...

  8. 时间复杂度的计算详解

    时间复杂度计算分为以下三个步骤(推导大O阶): 1.用常数1取代运行时间中的所有加法常数 2.在修改后的运行次数函数中,只保留最高阶项 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数,得到的结 ...

  9. 主定理(主方法)求解递归式

    1.主方法使用条件 用主方法求解递归式有条件,必须要求递归式为以下形式: 其中a>=1,b>1,f(n)渐进趋正,意为对足够大的n,f(n)是正的,即n>= n 0 n_0 n0​时 ...

最新文章

  1. 164. Leetcode 435. 无重叠区间 (贪心算法-贪心区间)
  2. android 高度上分权重,安卓自适应布局(关于权重weight的使用技巧!)
  3. java commons lang 随机数_Apache Common-lang组件里随机数工具类RandomStringUtils的一个bug...
  4. 定了!2020年,6种将死的编程语言!
  5. 2018最新java基础学习路线
  6. 串行异步通信_每天学一点/ 电工:PLC:串行通信
  7. 车辆保险过户所需材料(郑州)
  8. nodeName,nodeValue,nodeType,typeof,instanceof 的区别
  9. 如何面试前端工程师?
  10. 百度文库的内容怎么复制粘贴下来呢,look
  11. html扫雷源码js,js实现扫雷源代码.pdf
  12. 盲目的相信——写在购买陆谷孙先生主编的《英汉大词典》之后
  13. MFC中动态检测串口热插拔的实现
  14. CLion程序编译错误 0xC0000135
  15. 关于GIS中Scale和Resolution的那些事儿
  16. 哀悼日很多网站都变成了灰色,这是怎么做到的?
  17. C++描述 LeetCode 5676. 生成交替二进制字符串的最少操作数
  18. 自动上传视频到B站和西瓜视频
  19. Objective-C的方法替换
  20. 吉大计算机学院课外八学分,通知|关于吉林大学课外八学分相关规定

热门文章

  1. 你的心思,我如何懂得?
  2. 远程Gitlab新建的分支在IDEA里不显示
  3. c# 自然序号,在C#中的自然排序
  4. win8mysql安装教程zip_mysql 8.0.18.zip安装配置方法图文教程(windows 64位)
  5. 无法连接MySQL_MySQL不能从外部 连接的解决方法
  6. 计算机教师资格证报考科目,还在纠结报考教师资格证该选哪个科目呢?看完这篇,你不再迷茫...
  7. mysql与access数据库_mysql数据库和access数据库有什么不同吗?
  8. SCAPY pcap文件数据分析 python3
  9. java 矩阵_(JAVA)计算机图形学与矩阵
  10. vb计算机考试试题及答案,计算机二级考试《VB》操作试题及答案2016