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

原创 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.基本的渐进效率类型:






图片用自:

点击打开链接


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

算法效率分析

1.非递归算法的效率分析 l 确定算法的输入规模(如数组的长度,矩阵的阶) l 找算法的基本操作(一般位于最内层循环) l 确定基本操作的执行次数是否只与输入规模有关,若还与输入的其他特性,则要...
  • CHEN_JP
  • CHEN_JP
  • 2012年09月12日 23:23
  • 1838

【算法分析与设计】各种排序算法的效率对比

排序在编程的过程中是非常重要的一类算法。一个好的排序算法可以让我们整体的算法效率提高很多,但是不同的排序算法实现起来的难度也有比较大的差别。那么现在具体来看一下各个排序算法的主要思想。   1、直接...
  • qq_32353771
  • qq_32353771
  • 2017年01月17日 19:56
  • 1095

时间复杂度&空间复杂度分析

时间复杂度:   一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),进而分析f(n)随n的变化情况并确定T(n)的数量级。这里用"O"来表示数量级,给出算法的时间复杂度。    ...
  • LF_2016
  • LF_2016
  • 2016年09月06日 20:25
  • 8838

数据结构之时间.空间复杂度分析

在很多数据结构的面试题中看似简单,但是对题目的要求却挺高,主要就体现在复杂度分析方面。复杂度又分为时间复杂度和空间复杂度。 1.时间复杂度 时间复杂度实际就是函数,函数计算执行的基本操作次数 . 在...
  • qq_29503203
  • qq_29503203
  • 2016年09月07日 22:55
  • 1698

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

算法的时间复杂度和空间复杂度 1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法...
  • zolalad
  • zolalad
  • 2013年09月20日 16:01
  • 95671

时间复杂度和空间复杂度详解

没有挤公交来上班过,就不知道生活的压力有多大。 算法的时间复杂度和空间复杂度合称为算法的复杂度。 1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试...
  • booirror
  • booirror
  • 2012年07月02日 00:32
  • 163716

算法-时间复杂度和空间复杂度

2.9 算法时间复杂度 2.9.1 算法时间复杂度定义 在进行算法分析时 , 语句总的执行次数 T ( n )是关子问题规模n的函数,进而分析 T ( n )随 n 的变化情况并确定T(n)的数量级...
  • smile_from_2015
  • smile_from_2015
  • 2017年02月23日 21:40
  • 1839

程序的时间和空间复杂度

算法的时间复杂度和空间复杂度
  • jinhuoxingkong
  • jinhuoxingkong
  • 2016年12月20日 19:41
  • 939

如何比较两个算法的效率

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

六种查找算法效率比较

接着上次的排序算法讨论,这次谈的是六种查找算法,分别是:顺序查找、折半查找、二叉树查找、索引查找、开地址哈希查找方法、拉链法哈希查找方法。   由于查找一个数的过程,无论运用哪种算法对于电脑来说速度...
  • fujibayashikyo
  • fujibayashikyo
  • 2014年04月03日 15:37
  • 1617
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:重拾算法(一):算法效率分析(空间复杂度和时间复杂度)
举报原因:
原因补充:

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