第一章——算法分析

本文详细介绍了算法分析中的时间复杂度和空间复杂度。通过分析算法的运行时间和占用内存,揭示了时间复杂度和空间复杂度的概念,并讨论了如何利用朗道符号描述增长趋势的上界和下界。文中通过实例解析了递归算法的时间复杂度分析,展示了如何建立递推关系式并求解。此外,还讨论了算法的最好、最坏和平均情况,并给出了几个例子进行说明。
摘要由CSDN通过智能技术生成

算法分析

第一章节算法的概念和特性,我们了解到算法除了普通程序需要满足的基本性质另外想要满足的性质有:正确性,高效率和低储存量需求,健壮性,可读性和可使用性。其中健壮性,可读性和可使用性可以通过我们不断地完善我们的代码和注释来进行提升。

算法分析准确来说分析的是算法的正确性,效率和储存量需求。算法的正确性可以通过数学方法证明和数据集验证的方法去处理。

我们这里的算法分析是分析算法占用计算机资源的情况,计算机资源主要包括时间和内存空间,所以算法分析的两个主要方面是分析算法的运行时间和占用内存情况。

运行时间和占用内存的单位分别是秒和字节数,但如果我们只用这两个值来衡量一个算法的效率和储存量需求而不结合问题的规模考虑是不合理的,如果一个问题的规模很大,那么很大可能它的运行时间和占用内存比规模较小的问题都是要高的。

统一计算机的硬件和软件(编译器)条件,我们可以认为算法的执行时间和占用内存大小依赖于且只依赖于问题需要处理的数据(操作)的规模(通常用整数n表示),即以n作为自变量存在一定的函数关系。

这个以n作为自变量,反映运行时间与占用内存和问题规模之间关系的函数称为时间(空间)复杂度。问题规模一般通过问题的数据直接得到,运行时间与占用内存的得到有两种方式:直接执行程序,通过某些库计算程序执行的时间和占用的内存;因为程序的本质是指令序列,通过指令序列包含的指令估算程序预计运行的时间和占用的内存。

前一种方法称为事后统计法,后一种方法称为事前分析估算法,事后统计法存在必须执行程序,以及数据可能存在特殊性掩盖算法本质的缺点,所以一般采用的是事前分析估算法。


算法时间复杂度分析

一个算法是由控制结构(顺序,分支和循环3种)和原操作(指固有数据类型的操作)构成的,算法的运行时间取决于两者的综合效果。

在这里插入图片描述
从计算运行次数的角度来看,顺序结构直接累加顺序结构下代码的操作数,分支结构判断进入了哪条分支累加该分支的操作数,循环结构则相当于累加了若干次循环内的操作数。

得到操作数,我们就能够通过问题规模n来表示操作数,即即以n作为自变量找到问题规模n和操作数f(n)之间的函数关系f。

我们需要的往往不是确定的f,而是一种增长趋势的度量,例如f(n)=n3+197n+23421,当n的值较小时,197n,23421这些较低次数的值对f(n)值的增长影响较大;但当n的值较大时,f(n)的增长趋势贴近于n3,我们在这里称f(n)的阶为n3

我们认为当问题规模n较小时问题具有特殊性,所以只考虑当问题规模n充分大时算法中基本语句的执行次数在渐进意义下的阶,我们通常有三种符号进行表示(都对应的是阶,但是不同符号对应的确切意义不同),这类符号我们称为朗道符号。

增长趋势渐进上界

定义:f(n)(f(n)为阶)=O(g(n))(g(n)为函数关系),当且仅当存在正值常量c和n0,使当n≥n0时,f(n)≤c*g(n),即g(n)为f(n)的上界。

例如:

3n+2=O(n),因为当n≥2时,3n+2≤4n。
10n2+4n+2=O(n4),因为当n≥2时,10n2+4n+2≤10n4

大O符号用来描述增长率的上界,表示f(n)的增长最多像g(n)增长的那样快,也就是说当输入规模为n时,算法消耗时间的最大值。这个上界的阶越低,结果就越有价值,所以,对于10n2+4n+2,O(n2)比O(n4)有价值(但这并不代表O(n4)是没有意义的)。

一个算法的时间用大O符号表示时,总是采用最有价值的g(n)表示,称之为紧凑上界或紧确上界。

一般地,如果f(n)=a*nm+b*nm-1+…+y*n+z(这里用a到z表示不是说最高次为26次),有f(n)=O(nm)。

增长趋势渐进下界

定义:f(n)=Ω(g(n)),当且仅当存在正常量c和n0,使当n≥n0时,f(n)≥c*g(n),即g(n)为f(n)的下界。

一上面的两个g(n)为例:

3n+2=Ω(n),因为当n≥1时,3n+2≥3n。
10n2+4n+2=Ω(n2),因为当n≥1时,10n2+4n+2≥n2

同样地,也有紧凑下界的概念,来避免增长趋势被过度地低估:

大Ω符号用来描述增长率的下界,表示f(n)的增长最少像g(n)增长的那样快,也就是说,当输入规模为n时,算法消耗时间的最小值。

与大O符号对称,这个下界的阶越高,结果就越有价值,所以对于10n2+4n+2,Ω(n2)比Ω(n)有价值。一个算法的时间用大Ω符号表示时,总是采用最有价值的g(n)表示,称之为“紧凑下界”或“紧确下界”。

一般地,如果f(n)=a*nm+b*nm-1+…+y*n+z(这里用a到z表示不是说最高次为26次),有f(n)=Ω(nm)。

朗道符号

(这里写作大O)

定义:f(n)=O(g(n)),当且仅当存在正常量c1,c2和n0,使当n≥n0时,有c1*g(n)≤f(n)≤c2*g(n),即g(n)与f(n)的同阶。

朗道符号就是介于大O符号和大Ω符号之间表示的最精确的增长趋势,f(n)=O(g(n))当且仅当g(n)即是f(n)增长趋势的上界也是f(n)增长趋势的下界,我们一般说的时间复杂度就是朗道符号对应的阶。

三种渐进符号作为一元运算都满足传递性,自反性和对称性,算术运算的概念如下:

在这里插入图片描述
其中乘法做直接运算,加法分别考虑渐进符号对应的实际意义(上界取较大,下界取较小)。

渐进符号对应的阶一般有n!,cn,nc,nc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值