1.时间复杂度

  算法的计算成本涵盖许多方面,为确定计算成本的度量标准,我们不妨从计算速度这一重要因素入手。

  但是这一问题并不是容易直接上手回答,原因在于,运算时间是由许多因素综合作用而决定的。即使是同一算法,对于不同的输入所需的运算时间并不相同。问题规模往往是决定计算成本的主要因素。一般的,问题规模越相近,相应的计算成本也越相近;而随着问题的扩大,计算成本通常也呈上升趋势。

  所以,执行时间这一变化趋势可以表示为输入规模的一个函数,称作该算法的时间复杂度(time complexity)。具体的,特定算法处理规模为n的问题所需时间可记为T(n)。从严格上来说,在规模为n的所有输入中选择实行时间最长者为T(n),并以T(n)度量该算法的时间复杂度。

  对于相同输入规模n的输入,通过比较T(n),便可以评价不同算法的计算效率高低。然而,藉此还不足以就其性能优劣作出具体性的评判,比如对于某些问题,一些算法更适用于小规模的输入,有些则相反。

  在实际问题处理中,我们常常可以忽略较小规模输入的效率差异,因为其绝对时间开销较小;但是对于较大规模的输入,效率的些许差异将会造成时间开销的极大差异。对于注重时间复杂度的总体变化趋势和增长速度的策略和方法,称为渐近分析(asymptotic analysis)

  对足够大的的输入规模n进行评价度量,我们引入O记号。

  处于保守估计,我们关注T(n)的渐进上界。具体的,对于任何n>>2都有:t(n)<=c*f(n)  ;由这一定义可认为在n足够大之后,f(n)给出了T(n)增长速度的一个渐进上界。此时记之为:

     T(n)=O(f(n))

  由这一定义可导出O记号的性质:

1.对任意一常数c>0,有O(f(n))  = O(c*f(n))

2.对任意一常数a>b, 有O(n^a+n^b) = O(n^a)

  前一性质意味在O记号的意义下,函数各项正的常系数可以忽略并等同于1,;后一性质则意味着多项式中低次项均可以忽略,只需保留最高次项。可以看出,O记号的这些性质的确体现了对函数总体渐进增长趋势的关注和刻画。


但是同一算法在不同的硬件平台上所需的计算时间均不相同,因此有必要采用一种超脱于具体硬件平台和软件环境的某一客观标准,来度量时间复杂度,进而评价不同算法的效率差异。 所以我们引入基本操作这一概念。



在图灵机等计算模型中,指令语句均可分解为执行若干次基本操作,比如 算术运算,比较,分支,子程序调用与返回等;在大多数计算环境中,基本操作均可以在常数时间内完成。

  于是我们可以将T(n)定义为算法执行基本操作的总次数。这样,只需统计出该算法所执行的基本操作数目便可以确定T(n)的上界。

下面我们通过一个具体的例子来看T(n)的计算方法和性质。


  以此冒泡排序算法为例,算法为内外两层循环,当输入规模为n个元素数组时,内层循环依次比较相邻两元素大小,每一次需要进行n-1次比较,至多需要交换n-1次。故内层循环每轮至多进行2(n-1)次基本操作。而外层循环最多执行(n-1)次循环(此处涉及算法正确性分析,此处不再详细说明),综上所述,该算法最多执行2(n-1)^2次基本操作,则有

T(n) = O(2(n-1)^2)  

根据O记号的性质可知,上式可进一步整理为:

T(n)  = O(2n^2-4n+2) = O(2n^2) = O(n^2)


最后,在O记号表示的时间复杂度估计并不排斥更好甚至最好的情况,对于这些情况,分别有大Ω记号(对算法执行效率最乐观的估计)和大θ记号(对算法执行效率的准确估计)。相比较而言,“最坏情况复杂度“是人们关注最多且使用最多的,在一些特殊场合下甚至是

唯一的指标。所以并不在此介绍,有兴趣的读者可以自行搜索相关性质。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值