算法的时间复杂度与空间复杂度

算法效率

  算法效率分析的目的是看算法实际是否可行,并在同一问题存在多个算法时,可进行时间和空间性能上的比较,以便从中挑选出较优算法。
  衡量算法效率的方法主要有两种:事后统计法和事前分析估算法。

一、事后统计法

  需要先将算法实现,然后测算其时间和空间开销。这种方法的缺陷很显然,一是必须把算法转换成可执行的程序,二是时空开销的测算结果依赖于计算机的软硬件等环境因素。

二、事前分析估算法

  因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣,所以我们通常采用事前分析估算法,通过计算算法的渐近复杂度来衡量算法的效率。
  一个算法用高级语言实现后,在计算机上运行时所消耗的时间与很多因素有关,例如:
    计算机的运行速度、所采用的编程语言、编译产生的机器语言代码质量和问题的规模等。
  撇开这些与计算机硬件、软件有关的因素,可认为一个特定算法的“运行工作量”的大小只依赖于问题的规模(通常用整数量n表示),或者说它是问题规模的函数。
  一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,算法的运行时间取决于两者的综合效果。

算法复杂度

  算法复杂度分为时间复杂度和空间复杂度。其作用:
    时间复杂度:执行算法所需要的计算工作量;
    空间复杂度:执行这个算法所需要的内存空间。
(算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。)

时间复杂度
  1. 问题规模
      算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。

  2. 时间频度
      一个算法的执行时间大致上等于其所有语句执行时间的总和,而语句的执行时间则为该条语句的重复执行次数和执行一次所需时间的乘积。
      一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为 T(n)。
      设每条语句执行一次所需的时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度之和来度量。
    例:求两个n阶矩阵的乘积算法。
    在这里插入图片描述
      该算法中所有语句频度之和,是矩阵阶数n的函数,用f(n)表示之。换句话说,上例算法的执行时间与f(n)成正比。
                            f(n)=2n3+3n2+2n+1

  3. 时间复杂度
      为了客观地反映一个算法的执行时间,可以用算法中基本语句的执行次数来度量,所谓基本语句指的是算法中重复执行次数和算法的执行时间成正比的语句。
      通常,算法的执行时间是随问题规模增长而增长的,因此对算法的评价通常只需考虑其随问题规模增长的趋势。这种情况下,只需考虑当问题规模充分大时,算法中基本语句的执行次数在渐近意义下的阶。如(例:求两个n阶矩阵的乘积算法)而言,当n趋向无穷大时,显然有
                   lim ⁡ n → ∞ ( f ( n ) / n 3 ) = lim ⁡ n → ∞ ( ( 2 n 3 + 3 n 2 + 2 n + 1 ) / n 3 ) = 2 \lim_{n\rightarrow\infty}(f(n)/n^3) = \lim_{n\rightarrow\infty}((2n^3+3n^2+2n+1)/n^3) = 2 limn(f(n)/n3)=limn((2n3+3n2+2n+1)/n3)=2
      即当n充分大时,f(n)和n3之比是一个不等于零的常数。即f(n)和n3是同阶的,或者说f(n)和n3的数量级( Order of Magnitude )相同。在这里,我们用 “O” 来表示数量级,记作 T(n)=O(f(n))=O(n3)。由此给出下述算法时间复杂度的定义。
      一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作 T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称O(f(n))为算法的渐近时间复杂度,简称时间复杂度
    数学符号 “O” 的严格定义为:
      若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0,使得当n>=n0时都满足0<=T(n)<=Cf(n)。

  4. 分析算法时间复杂度的基本方法为
      1> 找出所有语句中语句频度最大的那条语句作为基本语句;
      2> 计算基本语句的频度得到问题规模n的某个函数f(n);
      3> 取其数量级用符号 “O” 表示。

  5. 时间复杂度详情
      在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为O(1)。另外,在时间频度不相同时,时间复杂度有可能相同,如T(n)=n2+3n+4与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。
    常见的时间复杂度有:
      常数阶O(1)
    在这里插入图片描述
      对数阶O(log2n)
    在这里插入图片描述
      线性阶O(n)
    在这里插入图片描述
      平方阶O(n2)
    在这里插入图片描述
      立方阶O(n3),…, k次方阶O(nk),平方根阶O(√n),线性对数阶O(nlog2n),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
    在这里插入图片描述
      常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<O(√n) < Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

  6. 时间复杂度三种情况
      最坏时间复杂度:任意输入规模的最大允许次数(上界)
      平均时间复杂度:任意输入规模的期望运行次数
      最好时间复杂度:任意输入规模的最小允许次数(下界)
      例:在一个长度为N数组中搜索一个数据x
        最坏情况:N次找到
        平均情况:N/2次找到
        最好情况:1次找到

空间复杂度

  关于算法的存储空间需求,类似于算法的时间复杂度,采用渐近空间复杂度作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作 S(n)=O(f(n))

  空间复杂度(SpaceComplexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。
  **算法的输入输出数据所占用的存储空间是由要解决的问题决定的,是通过参数表由调用函数传递而来的,它不随本算法的不同而改变。**存储算法本身所占用的存储空间与算法书写的长短成正比,要压缩这方面的存储空间,就必须编写出较短的算法。算法在运行过程中临时占用的存储空间随算法的不同而异,有的算法只需要占用少量的临时工作单元,而且不随问题规模的大小而改变,我们称这种算法是“就地"进行的,是节省存储的算法,有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法就属于这种情况。
  示例:

  1. 例1
    在这里插入图片描述
    仅需要另外借助一个变量t,与问题规模n大小无关,所以其空间复杂度为O(1)。
  2. 例2
    在这里插入图片描述
    需要另外借助一个大小为n的辅助数组b,所以其空间复杂度为O(n)。

总结

  对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。
  当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。
  通常情况下,鉴于运算空间较为充足,人们都以算法的时间复杂度作为算法优劣的衡量指标。
  因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值