时间复杂度分析:递归算法
递归算法中的时间复杂度有好几种解法,在我看来,最容易掌握的是迭代法和递归树法,这就列出这两种
迭代法:
*** 从原始递推方程开始,反复将对于递推方程左边的函数用右边的等式代入,直到得到初值,然后将所得的结果进行化简。
例如在调用归并排序mergeSort(a,0,n-1)对数组a[0…n−1]a[0…n−1]排序时,执行时间T(n)T(n)的递推关系式为:
其中,O(n)为merge()所需要的时间,设为cn(c为正常量)。因此:
类似的,我们也可以用迭代法求解汉诺塔递归求解时的时间复杂度。但遗憾的是,迭代法一般适用于一阶的递推方程。对于二阶及以上(即T(n)依赖它前面更多个递归项T(n)依赖它前面更多个递归项)的递推方程,迭代法将导致迭代后的项太多,从而使得求和公式过于复杂,因此需要将递推方程化简,利用差消法等技巧将高阶递推方程化为一阶递推方程。如在求快速排序算法平均时间复杂度T(n)的递推方程,T(n)依赖T(n−1)、T(n−2)、…、T(1)T(n−1)、T(n−2)、…、T(1)等所有的项,这样的递推方程也称为全部历史递推方程。
递归树法:
***递归树是一棵结点带权值的树。初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1))。
迭代规则:第一步: 把根结点T(n)用根是cn、左结点为T(n/2)、右结点为T(n/2)的子树代替(即:以分解、合并子问题需要的代价为根,分解得到的子问题为叶的子树。其中常量c代表求解规模为1的问题所需的时间);(如下如(a)→(b))
第二步:把叶结点按照“第一步”的方式展开;T(n/2)用根是cn/2、左节点为T(n/4)右结点为T(n/4)的子树代替。(如下如(b)→©)
第三步:反复按照“第一步”的方式迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1))。(如下如©→(d))
例如:
画出如下图:
在得到递归树后,将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价。在上图(d)部分中,完全展开的递归树高度为lgn(树高为根结点到叶结点最长简单路径上边的数目),所有递归树具有lgn+1,所以总代价为cn∗(lgn+1),所有时间复杂度为Θ(nlgn)
时间复杂度分析:递归算法相关推荐
- 递归算法及其时间复杂度分析
引言 "递归" 一词是比较专业的计算机术语,在现实生活中,有一个更可爱的词--"套娃".如果把"递归算法"叫做"套娃算法" ...
- 递归算法时间复杂度分析
递归算法时间复杂度分析 时间复杂度: 一般情况下,算法中基本操作重复的次数就是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确 ...
- 递归算法中的时间复杂度分析
对于一种算法的时间复杂度分析还是特别重要的,在一些非递归算法中,我们仅仅看运算次数最多的那一行代码可能执行多少次就可以,实际就是看在循环中变量的变化,但是对于递归算法中该怎么分析呢?下面介绍几种递归函 ...
- 算法:递归(借助递归树来求解分析递归算法的时间复杂度)
递归代码的时间复杂度分析起来非常麻烦,今天我们尝试来借助递归树分析递归算法的时间复杂度. 1. 递归树与时间复杂度分析 递归的思想就是将大问题一层一层地分解为小问题来求解,如果我们把这个分解过程画成图 ...
- 斐波那契数列递归算法和非递归算法以及其时间复杂度分析
1.在学习数据结构这门课的过程中,发现斐波那契数列的递归算法以及非递归算法,以及其时间复杂度分析是一个小难点.所以特别总结一下. 斐波那契数列的表达式: Fibonacci数列简介: F(1)=1 F ...
- 递归函数时间复杂度分析
递归函数时间复杂度分析 (1) 递归执行过程 例子:求N!. 这是一个简单的"累乘"问题,用递归算法也能解决. n! = n * (n - 1)! ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- 随机选择算法时间复杂度分析
随机选择算法时间复杂度分析 首先提供算法的伪代码: 算法是递归算法 时间复杂度分析思路:计算每一次递归语句所消耗的时间,再求和. 为了分析需要,我们先定义如下的量: 定义状态j:数组长度在[(3/4) ...
- 归并排序执行次数_归并排序过程、时间复杂度分析及改进
前言 上一篇文章,介绍过第一种基于分治策略的排序算法--快速排序.接下来我们来讨论另一种基于分治策略的排序算法,归并排序.归并排序也被认为是一种时间复杂度最优的算法,我们还是按照基本过程,代码,最坏时 ...
- 算法时间复杂度分析基础
摘要 本文论述了在算法分析领域一个重要问题--时间复杂度分析的基础内容.本文将首先明确时间复杂度的意义,而后以形式化方式论述其在数学上的定义及相关推导.从而帮助大家从本质上认清这个概念. ...
最新文章
- ECSHOP学习笔记
- 当NLPer爱上CV:后BERT时代生存指南之VL-BERT篇
- LINUX 触摸屏驱动
- 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
- MVC5+EF6 入门完整教程 总目录
- linux账号登陆安全性相关命令
- 高级音频降噪插件:Klevgrand Brusfri for Mac
- rsync 全网备份企业案例
- java socket 连接原理_Java socket通信基本原理介绍
- android结束进程,卧薪尝胆70天内推入职阿里,附答案
- MySQL和SQLyog安装配置教程
- 磨煤机监测参数及实际运行数据
- 怎样能把在线视频(不提供下载)储存下来到电脑
- 飞利浦Georg Jensen联名系列真无线耳机JT60重磅上市
- 推荐《我是谁 – 没有绝对安全的系统》CLAY——Clown Laughing At You「小丑的嘲笑」
- 红黑树 插入算法(一)
- Instagram帐户几种不同类型的封号情况及解决方案
- 多个日期时间段进行合并计算时长,剔除重叠时间段
- PHP接口的概念与接口的应用场景
- One_DPLayer -一款简单好用的在线播放器[DPLayer]
热门文章
- onion spring_英语里的葱不都是Onion
- C语言数组 :用户输入一个数, 我要用这个数当数组的长度。怎么办呢
- 华为-交换机堆叠配置
- 计算机系统处理机,处理机
- 看顶级渣男如何邀约100个女朋友(二)
- 第一次参与国际空间站ISS 的SSTV活动
- spring容器里存取bean
- linux 子程序返回错误代码,execvp:在程序中调子程序并获取返回值
- Csharp零基础:第一天学Csharp要会的基础知识
- Must call super constructor in derived class before accessing 'this' or returning from derived const