递归算法时间复杂度和空间复杂度分析与举例
文章目录
- 前言
- 1、递归算法性能分析公式
- 1.1 时间复杂度计算公式
- 1.2 空间复杂度计算公式
- 1.3 例子
- 1.3.1 暴力算法
- 1.3.2 递归算法
- 1.3.3 优化递归算法
- 总结
前言
根据代码随想录博主整理的
主要是为了记录递归算法如何分析其性能,并如何根据其性能来优化递归算法。
1、递归算法性能分析公式
1.1 时间复杂度计算公式
递归算法的时间复杂度 = 递归的次数 * 每次递归的时间复杂度。
1.2 空间复杂度计算公式
递归算法的空间复杂度 = 递归的深度 * 每次递归的空间复杂度。
1.3 例子
计算整数x的n次方
1.3.1 暴力算法
int function(int x, int n) {int ans = 1;for(int i = 0; i < n; i++) {ans = ans * x;}return ans;
}
时间复杂度为O(n),空间复杂度为O(1)。
1.3.2 递归算法
int recursion(int x, int n) {if (x == 0)return 0;if(n == 0)return 1;// 整数(零除外)的0次方为1if(n == 1)return x;// 退出递归条件return recursion(x, n - 1) * x;
}
时间复杂度 = 递归的次数 * 每次递归的时间复杂度 = O((n - 1) * 1) = O(n);
空间复杂度 = 递归深度 * 每次递归的空间复杂度 = O((n - 1) * 1) = O(n);
1.3.3 优化递归算法
为了降低时间复杂度,那么就需要O(log n)复杂度,假设每次递归时间复杂度为常熟O(1),那么,递归次数就需要为m = log n次。因为2^m = n,那么每次递归都可以减半,这样就可以重复利用这次递归结果,大大降低时间复杂度。
int recursion2(int x, int n) {if(x == 0)return 0;if(n == 0)return 1;// 整数(零除外)的0次方为1if(n == 1)return x;// 退出递归条件int temp = recursion1(x, n / 2);if(n % 2 == 1) {return temp * temp * x;// n为奇数时}return temp * temp;// n为偶数时
}
时间复杂度 = 递归的次数 * 每次递归的时间复杂度 = O((log n) * 1) = O(log n);
空间复杂度 = 递归深度 * 每次递归的空间复杂度 = O((n - 1) * 1) = O(n);
总结
在使用递归时,需要注意,是否存在多余计算,如何减少重复计算部分,就可对此进行优化处理。
递归算法时间复杂度和空间复杂度分析与举例相关推荐
- 数据结构:递归算法时间复杂度与空间复杂度计算方法
Ⅰ.递归算法求时间复杂度步骤 1.步骤 ①先将这个递归算法分成两类,一类是满足递归条件时,一类为递归停止条件时 ②然后分别算出这两类的执行次数.注意!如果在满足递归条件这一类中,计算执行次数的时候,发 ...
- 算法时间复杂度、空间复杂度分析
算法时间复杂度 在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素: 1.算法采用的策略和方案; ⒉编译产生的代码质量 ...
- 时间复杂度与空间复杂度分析
作为开发人员,我们都希望在完成功能的基础上让代码运行的更快.更省空间,那如何衡量编写的代码是否更有效率,这就需要我们学会如何分析代码时间复杂度和空间复杂度. 什么是复杂度分析 执行时间和占用空间是代码 ...
- 时间复杂度和空间复杂度分析
基本概念 算法:是解决某一特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示有一个或者多个操作.对于一个特定问题进行求解,可以使用不同的算法,或许最终结果是一样的,但在此过程中消 ...
- 时间复杂度和空间复杂度分析技巧
一.算法效率度量 如何度量一个算法的执行效率/时间呢?可以利用计算机的计时功能,来度量算法执行效率高低.这种方法也叫事后统计法. 事后统计法有很大的局限性: 测试结果依赖环境:不同的处理器.不同的操作 ...
- c语言——直接插入排序实现(时间复杂度与空间复杂度分析)
c语言--直接插入排序 插入排序就是将一个记录插入到已排好序的序列中,从而得到一个新的有序序列. 哪里有一个排好序的序列 那问题是我们要排序的是一个数组,哪里来一个排好序的序列呢?这时,我们可以把数组 ...
- Pyhton 描述 归并排序算法详解 时间复杂度,空间复杂度分析
算法描述分析: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有 ...
- 时间复杂度、空间复杂度的分析--王争数据结构与算法学习笔记
我们使用时间复杂度和空间复杂度来衡量算法代码的执行效率,那么为什么要这么麻烦需要自己去衡量一遍呢?把代码跑一遍,通过统计.监控,就能得到算法执行的时间和占用的内存大小.为什么还要做时间.空间复杂度分析 ...
- 斐波那契数与二分法的递归与非递归算法及其复杂度分析
1. 什么是斐波那契数? 这里我借用百度百科上的解释:斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列.费波那西数列.费波拿契数.费氏 ...
最新文章
- 拒收苹果超10万元赏金!程序员小哥找出iCloud账户漏洞后,发文直指苹果不够公开透明...
- Docker 大势已去,Podman 万岁
- 怎么学python-结合学习经历,谈一谈如何学习Python
- 参数(parameter)和属性(attribute)的区别
- 【C / C++】关于数组太大在编译器不能运行问题
- Git多个commit合并成一个【中间提交合并 尾部提交合并】
- 用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
- java forkjoin MySQL_Java并发fork-join框架
- 盘点一下结构体标签在Go中的应用
- android 视频编码vfr cfr,[转载]VFR的源转换CRF输出 批处理
- openCVPracticalExercise学习笔记01
- 一步一步手绘Spring MVC运行时序图(Spring MVC原理)
- 【信号与系统】拉普拉斯变换
- 点击率 ctr 与转化率 cvr
- 《mysql必知必会》学习笔记
- kangle安装php7.0_【Kangle】Linux下EasyPanel及PHP安装升级
- Pcode粗略分析(1)
- 【C语言笔记】【宏定义系列】 向下舍入到指定数值的倍数
- java支付宝提现功能,单笔转账到支付宝账户(公钥证书方式)
- python爬取豆瓣250排行榜数据
热门文章
- 车载通信——CAN收发器与CAN控制器
- (DES)Single-Shot Object Detection with Enriched Semantics
- ECN Trade:全球经济疲软,美国国债成新宠
- SyntaxError: Missing parentheses in call to ‘print‘. Did you mean print(e)?
- 游戏服务器到底是什么?
- 教你快速去除照片上的水印?操作简单,小白一学就会!
- 北京化工大学本科毕业论文答辩和论文选题PPT模板
- html js预览全景图,JS 实现全景图预览
- 趣拍云:助力APP一周上线人脸识别+动态贴纸
- 简易的Java版 eval()函数