Master公式计算递归时间复杂度
我们在算递归算法的时间复杂度时,Master定理为我们提供了很强大的便利!
Master公式在我们的面试编程算法中除了BFPRT算法的复杂度计算不了之外,其他都可以准确计算!
这里用求数组最大值的递归函数来举例:
public static int getMax(int[] arr, int L, int R) {
if (L == R) {
return arr[L];
}
int mid = (L + R) / 2;
int maxLeft = getMax(arr, L, mid);
int maxRight = getMax(arr, mid + 1, R);
return Math.max(maxLeft, maxRight);
}
master公式:也叫主定理。它提供了一种通过渐近符号表示递推关系式的方法。
应用Master定理可以很简便的求解递归方程。
T [n] = a*T[n/b] + O (N^d)
①当d<log(b,a)时,时间复杂度为O(n^(logb a))
②当d=log(b,a)时,时间复杂度为O((n^d)*logn)
③当d>log(b,a)时,时间复杂度为O(n^d)
以getMax来说明
将整个数组分为两部分,则左部分为n/2,右部分也为n/2,两者相加,返回操作为O(1)
则得到的式子如下:
T [n] = 2*T[n/2] + O (1)
a=2,b=2,d=0
d<log(b,a)则时间复杂度为O(n)
说明:
递归 就是系统帮自己做 压栈和出栈的过程
分析那个例子:
1 max(arr,0,3) ,开始执行 ,mid=1,然后到 max(arr,0,1)
2 遇到自己的方法max之后,就把当前的状态进行压栈,状态包括 方法调用到第几行,以及过程中的变量,如mid=1,left=0,right=3
3 max(arr,0,1)开始执行,mid=0,然后到max(arr,0,0)
4 遇到自己的方法max之后,就把当前的状态压栈,状态包括 方法调用到第几行,以及过程中的变量,如mid=0,left=0,right=1
5 max(arr,0,0)开始执行,此时left==right,返回值。
6 返回的值如何知道返回给哪个函数呢?此时把 栈顶的信息拿出,还原以前的状态,此时栈顶为max(arr,0,1),运行到
int maxLeft = getMax(arr,L,mid) 这一行,那么返回的值就赋给maxLeft
7 返回之后,函数继续运行,到了int maxRight = getMax(arr,mid+1,R); 此时再把当前的状态压栈,max(arr,0,1) ,行号,maxLeft等
8 同样的方法 把值返回给maxRight,最后返回最大值。如果栈中还有元素,继续出栈,然后赋值,知道最后栈中没有元素。
Master公式计算递归时间复杂度的更多相关文章
- 算法初级面试题01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题
虽然以前学过,再次回顾还是有别样的收获~ 认识时间复杂度 常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作. 时间复杂度为一个算法流程中,常数操作数量的指标.常 ...
- master公式 ------ 求递归情况下的时间复杂度
剖析递归行为和递归行为时间复杂度的估算一个递归行为的例子T(N) = a*T(N/b) + O(N^d)1) log(b,a) > d -> 复杂度为O(N^log(b,a))2) log ...
- 数据结构与算法学习(二)——Master公式及其应用
本篇文章涉及公式,由于博客园没有很好的支持,建议移步我的CSDN博客和简书进行阅读. 1. Master公式是什么? 我们在解决算法问题时,经常会用到递归.递归在较难理解的同时,其算法的复杂度也不是很 ...
- 左神算法第一节课:复杂度、排序(冒泡、选择、插入、归并)、小和问题和逆序对问题、对数器和递归(Master公式)
第一节课 复杂度 排序(冒泡.选择.插入.归并) 小和问题和逆序对问题 对数器 递归 1. 复杂度 认识时间复杂度常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数 ...
- 22.1.7 master公式及O(NLogN)的排序
22.1.7 master公式及O(NLogN)的排序 1 master 公式 (1) 写公式 T(N) = a * T(N/b) + O(N^d); master公式用来求递归行为的时间复杂度,式中 ...
- 转:master公式(主方法)
master公式(也称主方法)是利用分治策略来解决问题经常使用的时间复杂度的分析方法,(补充:分治策略的递归解法还有两个常用的方法叫做代入法和递归树法),众所众知,分治策略中使用递归来求解问题分为三步 ...
- C语言:根据以下公式计算s,s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) -在形参s所指字符串中寻找与参数c相同的字符,并在其后插入一个与之相同的字符,
//根据一下公式计算s,并将计算结果作为函数返回值,n通过形参传入.s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+...+n) #include <stdio.h> ...
- 用python实现计算1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))类似的公式计算
作业需求: 开发一个简单的python计算器 1.实现加减乘除及拓号优先级解析 2.用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 ...
- WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题. 1.VS2012新建一个WPF应用程序WpfApp ...
随机推荐
- Nginx的使用(一)Nginx+IIS实现一个网站绑定多个https域名
使用nginx最初的目的是为了解决iis7下无法配置多个443端口的问题,iis7下不同的域名无法同时绑定443端口,据说iis8是可以的,但是iis8的话需要安装windows server2012 ...
- [Codeforces441E]Valera and Number
Problem 给定一个数x,有p%的概率乘2,有1-p%的概率加1,问操作k次,其二进制数下末尾零的个数的期望. Solution 每次操作只会影响到最后的8位 我们用dp[i][j]表示i个操作后 ...
- [Leetcode 134]汽车加油站 Gas Station (环形)
[题目] There are N gas stations along a circular route, where the amount of gas at station i is gas[i] ...
- python学习 day13 迭代器,生成器,枚举对象
一.复习 1.闭包:定义在函数内部的函数(被函数嵌套的函数) 2.装饰器:闭包的一个应用场景 -- 为一个函数添加新功能的工具 3.开放封闭原则:不能修改源代码,不能修改调用方式,但可以对外提供增加新 ...
- 2017年3月28日15:59:16 终于明白spring这套鬼东西是怎么玩的了
先说重点,新东家公司的项目框架没有一样是我之前用过的,首先pm和我说的是一套微服务的概念,微服务不同于传统的功能模块实现,他将服务松散化分不到各个系统之间,这样也是实现分散压力的一种. 微服务是由sp ...
- 剑指Offer 54. 字符流中第一个不重复的字符 (其他)
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- webStrom访问只一个很简单的html文件的时候显示local host无法访问。。
直接从文件夹运行html没问题的,,,然后百度半天,,乱七八糟的答案, 1.谷歌商店安装 JB插件--插件地址 https://chrome.google.com/webstore/detail/je ...
- idea快捷键的设置
因为开始学java被培训机构里的无良老师给带偏,"染上了"MyEclipse的快捷键"恶习",于是很难改了. 所以,在使用idea时,要设置快捷键了,快点适应之 ...
- SpringCloud使用Feign调用服务时,@FeignClient注解无法使用
关于解决这个问题的理论根源传送门:https://blog.csdn.net/alinyua/article/details/80070890我在这里只提供解决方案 0. 结论和解决方案 Spring ...
- Ajax请求传递数组参数
var ids = []; var rows=$("#tt").datagrid("getSelections"); for(var i=0; i<row ...