重拾算法(一):算法效率分析(空间复杂度和时间复杂度)

原创 2016年08月30日 20:14:52

前言:


算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。

时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再关注一个算法的空间复杂度。



空间复杂度:


程序所需要的空间主要由以下部分构成:
  指令空间。存储经过编译之后的程序指令。指令有操作数和操作码构成。
  数据空间。存储所有常量和所有变量值所需的空间。
  环境栈空间。保存函数调用返回时恢复运行所需要的信
息。 


(1)指令空间
程序所需指令空间的大小取决于如下因素:
  把程序编译成机器代码的编译器。所使用的编译器不同,
则产生的机器代码长度就会有所差异。
  编译时实际采用的编译器选项。 有些编译器带有选项, 如
优化模式、 覆盖模式等等。 所取的选项不同, 产生的机器
代码也会不同。
  目标计算机。 目标计算机的配置也会影响代码的规模。 例
如, 如果计算机具有浮点处理硬件, 那么, 每个浮点操作
可以转化为一条机器指令。 否则, 必须生成仿真的浮点计
算代码,使整个机器代码加长。
(2)数据空间
分成两部分:存储常量和简单变量;存储复合变量。
  存储常量和简单变量。 取决于所用的计算机和编译器, 以
及变量与常量的数目。
  存储复合变量。 包括数据结构所需的空间及动态分配的空
间。
(3)环境栈空间
调用一个函数时,下面数据保存在环境栈中:
  返回地址。
  所有局部变量的值、传值形式参数的参数值。
  所有引用参数的定义。
所以一个程序所需要的空间可分为两部分:
① 固定部分。独立于实例特征,主要包括指令空间、简单变
量以及定长复合变量占用的空间、常量占用的空间。
② 可变部分。 主要包括复合变量所需空间、 动态分配的空间、
递归栈所需要的空间。
  复合变量所需的空间依赖于所解决的具体问题。
  动态分配的空间和递归栈所需要的空间依赖于实例特征


例:template <class T> //
int Find( const T a[], int n, const T&x)
{   int i ;
for(i = 0; i<n&& a[i] != x; ++i){}
return(i== n) ? -1: i ;

问题。在a[0..(n-1)]中搜索x,
若找到则回所在的位置,否
则返回-1。
  实例特征。 采用数组的长度n
作为实例特征。
  分析。数组地址a需要4字节,参数x需要4字节,n需要4
字节,局部变量i需要4字节,整数常量-1需要4字节,总
共需要20字节,独立于n,所以 =
Find
( ) 0 S n 。
  注意。数组a所需要的空间是在其他函数中分配的,不能
算作函数Find所需要的空间。

我们在此说明算法的时间复杂度的计算方法:
在说明之前,我先讲几个概念:


1.输入规模:


在大多数的算法中,对于输入规模较大的算法,一般运行需要的时间久更长。例如:对于一组数据进行排序,你输入 10 个数跟你输入10000个数的算法运行时间是不一样的。所以在研究算法的效率时,把它作为一个以算法输入规模n为参数的函数是非常合乎逻辑的。但是要注意的是,并不是输入了多少数据,数据规模就是多少。输入规模是需要进行选取的。比如:对于两个n*n 的矩阵,你所写的算法的输入规模可以选取为n ,也可以选取为n*n。对于大多数的情况下,选取什么作为参数都是可以看出来的(经验有了,水到渠成)。比如:对于排序,查找等算法的输入规模一般都选取它们的输入数据量n,对于n次多项式来说,它的参数就是多项式的系数。


2.算法的运行时间度量:


算法的运行时间,你第一时间看到这个可能会以为算法的运行时间肯定会以秒,分钟,甚至小时等时间的标准度来表示。但是这样的表示方式存在有很大的问题:这种方式很是依赖计算机的运行速度,依赖于算法程序实现的质量已经你选用的编译器等等。而且这种方式会导致程序的运行时间难以计算,我们必须用一种不依赖与任何无关因素的度量标准:基本操作。也被称为算法中最重要的操作。比如:对两种排序算法,我们没有办法计算出程序运行了多少时间,但是我们可以根据计算来得到每个程序的基本操作所出现的次数:加减,赋值等等。基本操作可能会有很多种,但是我们只需要找出来贡献最大的那个就行了。对于数学问题的算法:最消耗时间的是除法,其次是乘法,最后是加法和减法。


3.增长次数:


就是当n变大时,即输入规模变大时,对算法的时间复杂度相关函数的相关影响。





4.算法的平均.最差.和最优效率:


算法的最差效率:当输入规模为n时,算法在最坏情况下的效率。

算法的最优效率:当输入规模为n时,算法在最优的情况下的效率。

算法的平均效率:在实际的假设情况下,算法所可能发生的正推推断下所具有的效率。一般是通过得到或者是假设各类输入的概率分布,以推导出我们所希望                                 的基本操作次数。

以顺序查找算法为例:

算法的最差效率:n个数据,在最后一次判断才找到。效率为n。

算法的最优效率:n个数据,第一次就判断就招到,效率为1

算法的平均效率:n个数据,我们先假设能招到的概率,然后我们需要求得在第一次查找招到的概率、第二次查找招到的概率等等一直求,然后算得总的操作                                  次数。得出算法的平均效率


算法时间效率分析框架:

对于输入规模为n 的算法,我们可以统计它的基本操作执行次数,对其效率进行度量。


5.渐进符号:













6.基本的渐进效率类型:






图片用自:

点击打开链接


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

如何比较两个算法的效率

在学算法的时候,经常会涉及分析算法的复杂度和效率的问题,按照书本上的理论通常也能够大概推出个结论。通常都是根据算法中重要的语句去推算,例如for 循环语句等。那么有没有可以用程序去真正上机实验的办法呢...
  • heqiuya
  • heqiuya
  • 2012年11月28日 10:14
  • 1889

影响算法效率的因素

影响算法效率的因素      1、从大的方面来讲,所选择的语言对算法的效率影响很大。一般来说,使用越高级的语言所需要的时间和空间就越大。另外,不同编译器产生的代码质量不同,这对算法的效率也会有影响。...

一个算法题目的两种不同效率级别的算法对比

题目描述 新成立的K-based王国颁布一部新的法案: 一个合法的k进制数为一个不含连续两个零的k进制数。 例如: 1010230  是一个合法的7位数 1000198  不是一个合法的数字 0...

快排最优时间复杂度,平均时间复杂度和最差时间复杂度分析

我们来分析一下快速排序法的性能。快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。如图9‐9‐7所示,它是{50,10,90,30, 70,40,80,60,20}在快...
  • HN_gsf
  • HN_gsf
  • 2016年08月19日 12:46
  • 7191

时间效率与空间效率的平衡

1.获取第index个丑数 一般方法不再论述,使用简便方法的思路是: 使用空间对换时间,不再去管不是丑数的数字,而是用一个数组,只针对丑数来进行判别和运算 丑数应该是另一个丑数乘以2,3或者5的...

算法效率度量:时间复杂度和空间复杂度

算法效率的度量是通过时间复杂度和空间复杂度来描述的。 .时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作T(n),它是该算法问题规模n的函数,时间复杂度...

递归函数时间复杂度分析

递归函数时间复杂度分析-----------------------(1) 递归执行过程
  • budapest
  • budapest
  • 2011年04月27日 21:41
  • 42411

常用的排序/查找算法的时间复杂度和空间复杂度

常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n...

第二章算法的效率度量

对于基与应用层面的算法,在现在的计算机硬件环境其实还是比较少需要考虑这个问题了,特别是pc机的编程,内存空间越来越大,所以被考虑得也越来越少,不过一个好的程序员,都应该对自己的程序有要求,每一个for...

算法的时间复杂度和空间复杂度-总结

算法的时间复杂度和空间复杂度 1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法...
  • zolalad
  • zolalad
  • 2013年09月20日 16:01
  • 79711
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重拾算法(一):算法效率分析(空间复杂度和时间复杂度)
举报原因:
原因补充:

(最多只允许输入30个字)