算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)
1. 递归排序题
通过递归算法来获取一个数组中的最大值
2. 算法思路
采用递归的思路来进行解题,那么肯定是需要自己调用自己的,这也就是递归,于是考虑怎么自己调用自己呢?我们可以采用二分法来制造递归的情况:
我们先取数组的下标中点,将数组分成两份,我们要一直分下去,直到每个单个元素全部出现,这个时候来比较其大小,并往上将最大值赋值给上级根节点,上级根节点和另外一个根节点比较,再传值…
3. 算法程序及注释
class Program{static void Main(string[] args){int[] t = { 3, 2, 1, 7, 8, 9, 0 };var m = GetMax.getMax(t);Console.WriteLine(m);Console.ReadLine();}}class GetMax{//方便调用public static int getMax(int[] arr){return process(arr, 0, arr.Length - 1);}//arr[L..R]范围求最大值public static int process(int[] arr, int L, int R){//到最后一个点时,返回他到上一级if (L == R){return arr[L];}//这一段是为了展现递归时的值//for (int i = L; i <= R; i++)//{// Console.WriteLine(arr[i]);//}int mid = L + ((R - L) >> 1);//中点,这样写是比较讲究的写法,拿右移位的位运算来代替除以2的操作,原因是位运算比较快//另外,一般平均值是这样(b+a)/2,但是b+a可能会溢出数据类型的最大范围,所以我们不这样写int leftMax = process(arr, L, mid);//取左边最大值,来递归一次int rightMax = process(arr, mid + 1, R);//取右边最大值,来递归一次return Math.Max(leftMax, rightMax);//最终比较叶节点,值给根节点}}
理解程序的流程图:
4. 递归的时间复杂度与master公式
怎么来对递归行为的时间复杂度来进行估算?
使用master公式(也称主方法)(对于一些特定的递归行为而言),是用来利用分治策略来解决问题经常使用的时间复杂度的分析方法
公式:
T(N)=a*T(N/b)+O(N^d)
使用条件:
1.里面递归的子项必须相同
2.n表示问题的规模
3.a是多少个相同的子项,表示递归的次数也就是生成的子问题数
4.(N/b)是说,把一个整的分了多少份,b表示每次递归是原来的1/b之一个规模
5.d指是,剩下的项是多少时间复杂度
举例来说,把一个数组分成了3份来递归,并逐次打印一遍数,那么我们发现子项都是1/3,符合第一个条件(递归的子项必须相同),于是a=3,N/b=1/3N,剩下的时间复杂度(逐次打印一遍数)是O(N),那么d=1的(因为O(N^d)=O(N))
也就是:T(N)=3*T(N/3)+O(N)
然后把a,b,d来进行下面结论的比较,发现符合等于的情况,那么该递归时间复杂度是O(N * logN)
结论:
注: log(b,a)也就是以b为底,a的对数
- log(b,a)>d =>复杂度为O(N^log(b,a))
- log(b,a)<d =>复杂度为O(N^d)
- log(b,a)=d =>复杂度为O(N^d * logN)
算法笔记-递归算法、递归排序、递归的时间复杂度、master公式(也叫主方法)相关推荐
- 算法笔记(JavaScript版)——排序
算法笔记(JavaScript版)--排序 本文内容根据Rebert Sedgewick和Kevin Wayne的<算法(第四版)>整理,原代码为java语言,自己修改为JavaScrip ...
- 第29讲 常见算法(查找算法、递归算法、排序算法)
文章目录 查找算法 1. 基本查找 2. 二分查找 3. 插值查找 4. 斐波那契查找 5. 分块查找 6. 哈希查找 7. 树表查找 递归算法 排序算法 1. 冒泡排序 2. 选择排序 3. 插入排 ...
- 算法 | 时间复杂度master 公式
master 公式 T(N) = a*T(N/b) + O(N^d) 估计递归问题复杂度的通式,只要复杂度符合以下公式,都可以套用此公式计算时间复杂度 例子:递归方式查找数组最大值 T(N) = 2* ...
- 《算法笔记》-各种排序算法、散列、递归、贪心、二分、双指针、随机选择算法(知识点+例题+代码)
一.排序 1.冒泡排序 进行数组大小-1趟排序 int a[]={3,4,1,5,2};//从小到大排序 //第一趟 3,4,
- 算法笔记----递归算法
文章目录 概念 递归算法的优缺点 经典例题 递归算法的优化 实战演练 概念 官方解释:一种通过重复将问题分解为同类的子问题而解决问题的方法. 我的理解:一种把大问题拆分成若干个算法逻辑相同的子问题,只 ...
- 算法中的各种排序以及查找时间复杂度
今天简单的总结一下算法中经常用到的排序以及查找(用C语言实现,不全,持续更新) 一.首先是最常见也是最常被问的冒泡排序(原理就是每趟排序相邻两两比较...因为比较好理解,就省略了) //冒泡排序 -( ...
- 算法笔记_036:预排序(Java)
目录 1 问题描述 2 解决方案 2.1 检验数组中元素的唯一性 2.2 模式计算 1 问题描述 在计算机科学中,预排序是一种很古老的思想.实际上,对于排序算法的兴趣很大程度上是因为这样一个事实: ...
- 算法笔记4.1--EXCEL排序
题目描述 Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始).随后在 N ...
- 算法笔记1926ProblemC Excel排序
题目描述 Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例,首先输出1行"Case i:",其中 i 是测试用例的编号(从1开始).随后在 N ...
最新文章
- Java程序的运行原理 用记事本编写Java代码
- 车辆检测--DAVE: A Unified Framework for Fast Vehicle Detection and Annotation
- ASP.NET 获取客户端IP (无视代理)
- 单词evolve 	pro	legacy	 launcher session
- php web server部署(PHP+Nginx+Redis+MySQL)
- 前端学习(3120):react-hello-react的setstate的使用
- 低代码会让程序员更加内卷吗?
- 在html中引用分享的链接
- 微信公号“架构师之路”学习笔记(五)-数据库扩展性架构设计(水平切分,秒级扩容,平滑迁移,在线表结构变更,一个大数据量多属性高并发的数据库设计等)
- ubuntu中使用.rpm
- 用计算机控制人造卫星和导弹发射,广西成人高校计算机实用基础统考理论试题(...
- matlab查表svpwm,SVPWM的MATLAB仿真实现
- 通过qmh启动qt应用
- 小学计算机上机评分表,海安市实验小学信息技术学科素养考核方案
- MySQL入门系列:MySQL数据类型
- 大厂程序员的一天是如何度过的?
- 在C ++中将二进制转换为十进制
- 微信公众号(服务号)申请时候需要补充的资料
- Python爬虫爬取古诗文网站项目分享
- MySQL常用存储引擎——Archive
热门文章
- 完全相同的4个小矩形如图所示放置_3个数学难题——走进传奇数学天才的数字游戏...
- 如何更好的招聘软件测试人员?
- machine learning
- Python3通过汉字输出拼音
- golang 使用 protobuf 的教程
- 如何阅读JAVA 字节码(一)
- 笔记 - Git使用
- VS2010在工具栏上创建查找组合框,即:CMFCToolBar中加入CMFCToolBarComboBoxButton
- 一起谈.NET技术,VS2010测试功能之旅:编码的UI测试(3)-操作对象的识别原理...
- 老赵的自然数分解——少侠之对象解