【数据结构】算法的渐进分析-渐进时间复杂度
算法的渐进分析(asymptotic algorithm analysis)简称算法分析。算法分析直接与它所求解的问题的规模 n 有关,因此,通常将问题规模作为分析的参数,求算法的时间和空间开销与问题规模的关系。
渐进的时间复杂度
计算程序步数的目的是想比较两个或多个完成相同功能的程序的时间复杂度,并估计当问题规模变化时,程序的运行时间如何随之变化。
要确定一个程序的准确的程序步数是非常困难的,而且也不是很必要。因为程序步数这个概念本身不是一个精确的概念。例如,赋值语句 x=a 和 x=a+b*(c-d)-e/f 居然具有相同的程序步数。
由于程序步数不能确切的反映运行时间,所以用精确的程序步数来比较两个程序,其结果不一定有价值。前面讨论迭代求和程序与递归求和程序的程序步数时,程序步数为 3n+2 的程序反而比程序步数为 3n+4 的程序运行时间多。但是,当两个程序的程序步数相差很大时,例如一个是 ⌈log2(n+1)⌉\lceil\log_2(n+1)\rceil⌈log2(n+1)⌉,另一个是 n∗(n−1)/2n*(n-1)/2n∗(n−1)/2 时,明显后者比前者运行时间多。
因此,如果精确计算有困难,我们只要能够得出一个是 log2n\log_2nlog2n的数量级,一个是 n2n^2n2的数量级,后者比前者运行时间多的结论,也能达到分析的目的。
大 OOO 渐进表示
要全面分析一个算法,需要考虑算法在最坏情况下的时间代价,在最后情况下的时间代价,在平均情况下的时间代价。对于最坏情况,主要采用大 OOO 表示法来描述。
大 OOO 表示法的一般前提是:当且仅当存在正整数 ccc 和 n0n_0n0,使得 T(n)≤cf(n)T(n)\leq cf(n)T(n)≤cf(n),使得所有的 n≥n0n\geq n_0n≥n0 成立,则称该算法的时间增长率在 O(f(n))O(f(n))O(f(n)) 中,记为 T(n)=O(f(n))T(n)=O(f(n))T(n)=O(f(n)) 。
使用大 OOO 表示法时需要考虑关键操作的程序步数。如果最后需要给出的时渐进值,可直接考虑关键操作的程序步数,找出其与 nnn 的函数关系 f(n)f(n)f(n) ,从而得到渐进时间复杂度。
接下来,根据大 OOO 表示法来看看接下来的例子。
1、(线性函数)考察 T(n)=3n+2T(n)=3n+2T(n)=3n+2。
T(n)=O(n)T(n)=O(n)T(n)=O(n)
2、(平方函数)考察 T(n)=10n2+4n+2T(n)=10n^2+4n+2T(n)=10n2+4n+2
T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2)
3、(指数函数)考察 T(n)=6∗2n+n2T(n)=6*2^n+n^2T(n)=6∗2n+n2
T(n)=O(2n)T(n)=O(2^n)T(n)=O(2n)
4、(常数函数)考察 T(n)=9T(n)=9T(n)=9
T(n)=O(1)T(n)=O(1)T(n)=O(1)
为了更好在具体情况下使用大 OOO 表示法,我们需要知道大 OOO 表示法的几个规则。
1、加法规则: 当两个并列的的程序段的时间代价分别为为 T1(n)=O(f(n))T_1(n)=O(f(n))T1(n)=O(f(n)) 和 T2(m)=O(g(m))T_2(m)=O(g(m))T2(m)=O(g(m)) 时,那么将两个程序段连在一起后整个程序段的时间代价为
T(n,m)=T1(n)+T2(m)=O(max{f(n),g(m)})T(n,m)=T_1(n)+T_2(m)=O(\max \{f(n),g(m)\} )T(n,m)=T1(n)+T2(m)=O(max{f(n),g(m)})
所谓 max{f(n),g(m)}\max\{f(n),g(m)\}max{f(n),g(m)} 是指当 nnn 和 mmm 充分大时取 f(n)f(n)f(n) 与 g(m)g(m)g(m) 中的最大值。在这个意义下显然有如下关系:
c<log2n<n<nlog2n<n2<n3<2n<3n<n!c<\log_2n<n<n\log_2n<n^2<n^3<2^n<3^n<n!c<log2n<n<nlog2n<n2<n3<2n<3n<n!
示例如下
//程序 1.26 计算渐进时间复杂度的程序示例
void example(float x[][n],int m){float sum[m];int i,j;for(i=0;i<m;i++){sum[i]=0.0;for(j=0;j<n;j++)sum[i]+=x[i][j]; //计算第 i 行的元素和}for(i=0;i<m;i++)cout<<"Line"<<i<<":"<<sum[i]<<endl; //打印第 i 行的累加和
}
根据加法规则,该程序的渐进时间复杂度为 O(max{m×n,m})O(\max\{m\times n,m\})O(max{m×n,m}) 。
2、乘法规则: 如果存在多层的嵌套循环,关键操作应在最内层循环中。先自外向内层层分析每层循环的渐进时间复杂度,然后利用大 OOO 表示法来计算其渐进时间复杂度。也就是说,当两个嵌套的程序段的时间代价分别是 T1(n)=O(f(n))T_1(n)=O(f(n))T1(n)=O(f(n)) 和 T2(m)=O(g(m))T_2(m)=O(g(m))T2(m)=O(g(m)) 时,那么整个时间段的时间代价为
T(n,m)=T1(n)×T2(m)=O(f(n)×g(m))T(n,m)=T_1(n)\times T_2(m)=O(f(n)\times g(m))T(n,m)=T1(n)×T2(m)=O(f(n)×g(m))
【数据结构】算法的渐进分析-渐进时间复杂度相关推荐
- 算法复杂度-渐进分析
算法复杂度-渐进分析 渐进表达式的定义 渐进上界 大OOO O(g(n))={f(n):∃c>0,n0>0.s.t.∀n≥n0,0≤f(n)≤cg(n)}O(g(n)) = \{f(n): ...
- 算法分析(渐进分析)
目录 1.T(n)函数 2.渐进分析 2.1渐进紧确界(θ记号) 举例 2.2渐进上界 (O记号) 举例 2.3渐进下界 (Ω记号) 举例 3.常用的换算公式 3.1举例证明 算法分析分为算法时间复杂 ...
- 计算机算法设计与分析(第5版)第二章练习题
一.选择题 二分搜索算法是利用(分治策略)实现的算法. 分治策略 动态规划 贪心法 回溯法 衡量一个算法好坏的标准是(时间复杂度低). 运行速度快 占用空间少 时间复杂度低 代码短 以下不可以使用分治 ...
- 数据结构与算法的分析 —— 渐进复杂度(三个记号)
对于某些问题,一些算法更适合于用小规模的输入,而另一些则相反.幸运的是,在评价算法运行效率时,我们往往可以忽略掉其处理小规模问题时的能力差异,转而关注其在处理大规模数据时的表现.道理是显见的,处理大规 ...
- 【算法设计与分析】05 有关函数的渐进的界的定理
上一篇文章学习了函数的渐近的界定义,本篇文章继续学习函数渐近的界定理.这些定理的证明,用到了函数渐近的界的定义.点击查看上一篇文章:[算法设计与分析]04 函数的渐进的界 文章目录 1. 定理1 1. ...
- 哈工大威海算法设计与分析_【斯坦福算法分析和设计02】渐进分析
点击上方蓝字,关注公众号 目录 1. The Gist 1.1 为什么要学它(Motivation) 1.2 High level idea 1.3 4个例子 2. Big-Oh Notation 2 ...
- 算法学习四:算法性能分析理论基础——函数增长与渐进分析
算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...
- 算法笔记——渐进分析和渐进符号
算法分析是理论研究,是关于计算机程序性能(performance)和资源利用(resource usage)的研究. More important than performents 模块化(耦合度越低 ...
- 算法设计与分析——算法学基础(三):渐进记号
分类目录:<算法设计与分析>总目录 相关文章: 算法学基础(一):算法学概述 算法学基础(二):分析算法 算法学基础(三):渐进记号 第<算法学基础(二):分析算法>中定义了算 ...
最新文章
- NLP模型超越人类水平?你可能碰到了大忽悠
- 华南师范大学计算机学院重修,为什么说本科绩点低毁一生 大学重修可以刷绩点吗...
- #1407 : 后缀数组二·重复旋律2 (不可重叠最长重复子串问题)
- sql 2012先分离迁移mdf mlf 文件到别的机器后附加 数据库成只读的修复方法
- 麒麟系统兼容安卓生态 弥补生态短板
- 从CLI监视OpenJDK
- 同一服务器部署多个tomcat时的端口号修改详情
- Spring MVC访问不到静态资源
- 种草!这只鹅虽然没有什么用,但是好可爱呀!
- AudioContext
- 如何使用TreeView控件
- 剑指offer题目系列二
- win10-如何管理开机启动项?
- 金融安全资讯精选 2017年第二期:金融网络安全和反欺诈方法论_金融新兴技术成熟度几何?...
- bat获取管理员权限运行
- Win10打开软件提示comdlg32.ocx文件丢失?
- CSDN图片上传去除水印
- 移动魔百盒CM201-2(emmc和nand)-分省模式-免拆机-强刷包及教程
- 【Java开发语言 03】第三章 面向对象编程(面向对象与面向过程+类和对象+类成员一:属性+类成员二:方法+对象的创建和使用+封装和隐藏+构造器+关键字this,package,import)
- 魔兽世界服务器是怎么维护的,魔兽世界服务器维护时 玩家可做的七件事