`
dlnzs
  • 浏览: 15881 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多
1、时间复杂度
  (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
  (2)时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
  在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1),另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。 按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),..., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。 2、空间复杂度 与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n)) 我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。讨论方法与时间复杂度类似,不再赘述。
  (3)渐进时间复杂度评价算法时间性能   主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。
【例3.7】有两个算法A1和A2求解同一问题,时间复杂度分别是T1(n)=100n2,T2(n)=5n3。
     (1)当输入量n<20时,有T1(n)>T2(n),后者花费的时间较少。
     (2)随着问题规模n的增大,两个算法的时间开销之比5n3/100n2=n/20亦随着增大。即当问题规模较大时,算法A1比算法A2要有效地多。它们的渐近时间复杂度O(n2)和O(n3)从宏观上评价了这两个算法在时间方面的质量。在算法分析时,往往对算法的时间复杂度和渐近时间复杂度不予区分,而经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。
【例3.8】算法MatrixMultiply的时间复杂度一般为T(n)=O(n3),f(n)=n3是该算法中语句(5)的频度。下面再举例说明如何求算法的时间复杂度。
【例3.9】交换i和j的内容。       
      Temp=i;        i=j;        j=temp;   以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。        如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
【例3.10】变量计数之一。
(1) x=0;y=0;
(2) for(k-1;k<=n;k++)
(3)      x++;
(4) for(i=1;i<=n;i++)
(5)        for(j=1;j<=n;j++)
(6)          y++;   
一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分。因此,以上程序段中频度最大的语句是(6),其频度为f(n)=n2,所以该程序段的时间复杂度为T(n)=O(n2)。  当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。
【例3.11】变量计数之二。
(1) x=1;
(2) for(i=1;i<=n;i++)
(3)        for(j=1;j<=i;j++)
(4)            for(k=1;k<=j;k++)
(5)                x++;   
该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,因此可以从内层循环向外层分析语句(5)的执行次数:  则该程序段的时间复杂度为T(n)=O(n3/6+低次项)=O(n3)。 (4)算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。
【例3.12】在数值A[0..n-1]中查找给定值K的算法大致如下:   
(1)i=n-1;           
(2)while(i>=0&&(A[i]!=k))       
(3)      i--;       
(4)return i;       
此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关: ①若A中没有与K相等的元素,则语句(3)的频度f(n)=n; ②若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。 (5)最坏时间复杂度和平均时间复杂度   最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。        这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
【例3.19】查找算法
【例1·8】在最坏情况下的时间复杂度为T(n)=0(n),它表示对于任何输入实例,该算法的运行时间不可能大于0(n)。       
平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。       
常见的时间复杂度按数量级递增排列依次为:常数0(1)、对数阶0(log2n)、线形阶0(n)、线形对数阶0(nlog2n)、平方阶0(n2)立方阶0(n3)、…、k次方阶0(nk)、指数阶0(2n)。显然,时间复杂度为指数阶0(2n)的算法效率极低,当n值稍大时就无法应用。       

2、类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)S(n)定义为该算法所耗费的存储空间,它也是问题规模n的函数。渐近空间复杂度也常常简称为空间复杂度。
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地\"进行的,是节省存储的算法,如这一节介绍过的几个算法都是如此;有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如将在第九章介绍的快速排序和归并排序算法就属于这种情况。
    分析一个算法所占用的存储空间要从各方面综合考虑。如对于递归算法来说,一般都比较简短,算法本身所占用的存储空间较少,但运行时需要一个附加堆栈,从而占用较多的临时工作单元;若写成非递归算法,一般可能比较长,算法本身占用的存储空间较多,但运行时将可能需要较少的存储单元。
    一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小,它包括为参数表中形参变量分配的存储空间和为在函数体中定义的局部变量分配的存储空间两个部分。若一个算法为递归算法,其空间复杂度为递归所使用的堆栈空间的大小,它等于一次调用所分配的临时存储空间的大小乘以被调用的次数(即为递归调用的次数加1,这个1表不开始进行的一次非递归调用)。算法的空间复杂度一般也以数量级的形式给出。如当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。
    对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当=i自求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

算法的时间复杂度和空间复杂度合称为算法的复杂度。
分享到:
评论

相关推荐

    算法复杂度——时间复杂度和空间复杂度.doc

    算法复杂度——时间复杂度和空间复杂度.doc

    数据结构与算法——算法、时间空间复杂度、线性表 定义线性表节点的结构.pdf

    数据结构与算法——算法、时间空间复杂度、线性表 定义线性表节点的结构.pdf

    计算机算法引论——设计与分析技术.rar

    计算机算法引论——设计与分析技术....介绍算法分析技术、算法的时间和空间复杂度分析方法;讨论各类经典的应用问题算法。科学出版社出版。本书是面向计算机、软件工程和网络工程技术人员的好书,值得一看。

    1.2_3_算法的空间复杂度1

    大小固定,与问题规模无关无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,算法空间复杂度为算法原地工作——算法所需内存空间为常量空间复杂度程序代码内存装

    东南大学操作系统实验——实现LRU算法及其近似算法

    编写程序实现LRU算法及其近似算法,并分析各算法的时间复杂度、空间复杂度和实现难度;通过随机生成页面访问序列,测试所实现算法的页错误率,并加以比较和分析。 此资源含完整代码和完整实验报告(加上你的学号姓名...

    《数据结构与算法分析——C语言描述》随书练习.zip

    算法的设计和选择会直接影响到程序的效率,因此,在设计和选择算法时,需要考虑到时间复杂度、空间复杂度等因素。 在实际应用中,数据结构和算法常常是密不可分的。通过对数据结构的理解和运用,以及对算法的学习和...

    x2-文本小节-常见算法时间复杂度.md

    - 算法的时间复杂度和空间复杂度 - 三大算法思维:贪心,二分,动态规划 - 常见数据结构 ## 注意事项 - 算法,有难度,轻耐心学习 - 不仅关注题目本身,更要关注知识点和解题思路 - 按顺序学习(本章课程按顺序...

    计算机算法引论——设计与分析技术(书签版)

    自己加了前8章的书签,是算法课使用的教材。 《计算机算法引论:设计与分析技术》是一本面向计算机、软件工程和网络工程专业及相关专业的本科生(高年级)和研究生教材,...介绍算法分析技术、算法的时间和空间复杂度分析

    数据结构&amp;算法——Java.zip

    基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,...

    计算机二级公共基础知识

    1、算法效率的度量——算法的复杂度:时间复杂度和空间复杂度。 1)算法时间复杂度:指执行算法所需要的计算工作量。通常,一个算法所用的时间包括编译时间和运行时间。 2)算法空间复杂度:指执行这个算法所需要...

    算法和数据结构——左程云.zip

    基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,...

    算法——硬币兑换:源代码

    (b) 时间复杂度 ,空间复杂度 (c) 这两个算法都同属于优化问题,背包问题在满足背包容量的前提下,来求得最大价值总量;该硬件兑换问题是在满足给定钱的条件下所需要的最少硬币数. 二者都是在满足约束的前提下...

    程序员代码面试指南——IT名企算法和数据结构题目最优解.zip

    基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,...

    DOA估计算法——ESPRIT算法

    ESPRIT算法是DOA估计算法中的一种经典算法,它可以根据子空间选择不变性直接得出估计角度的表达式,计算复杂度低。

    python算法笔记——数组

    概述 数据是最基本,最简单也是最常见的数据结构,属于线性结构的一种。...但是,从算法的角度而言,我们要考虑每个操作的时间复杂度和空间复杂度。所以我们来自己实现一段插入操作的代码: class MyArray: de

    oucb#3d-visualization-Iot-blog#《数据结构与算法分析》笔记一1

    《数据结构与算法分析——C语言描述》,第一二章的学习笔记,主要讨论时间复杂度与算法分析的方法。时间复杂度我们日常编写一段代码以解决一个特定问题时,为了判断这段代

    基于子空间跟踪的盲MMSE多用户检测算法

    在深入研究子空间方法盲多用户检测器子空间跟踪算法的基础上 ,针对OPAST 算法中矩阵 ...仿真结果表明 ,该算法具有稳定的全局收敛性 ,并保持了较低的算法复杂度,而其输出信噪比和误码率性能接近高算法复杂度的经典算法。

    小白算法积累——顺序表2#逆置

    题目:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1) 关键字:顺序表,逆置 思路: 1.遍历扫描,两两一对,头尾互换 需要变量:data[i] 和data[n-1-i]互为一对 互换小助手temp 遍历小助手...

    利用回溯法解决n皇后问题

    算法设计作业,用c++编写的,回溯法求解n皇后问题 运行环境VC6.0

    2018广东工业智造大数据创新大赛——智能算法赛.zip

    算法的设计和选择会直接影响到程序的效率,因此,在设计和选择算法时,需要考虑到时间复杂度、空间复杂度等因素。 在实际应用中,数据结构和算法常常是密不可分的。通过对数据结构的理解和运用,以及对算法的学习和...

Global site tag (gtag.js) - Google Analytics