怎么估算一个算法的时间复杂度

如题所述

递归算法的时间复杂度分析 收藏
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:

(1)代入法(Substitution Method)

代入法的基本步骤是先推测递归方程的显式解,然后用数学归纳法来验证该解是否合理。

(2)迭代法(Iteration Method)

迭代法的基本步骤是迭代地展开递归方程的右端,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。

(3)套用公式法(Master Method)

这个方法针对形如“T(n) = aT(n/b) + f(n)”的递归方程。这种递归方程是分治法的时间复杂性所满足的递归关系,即一个规模为n的问题被分成规模均为n/b的a个子问题,递归地求解这a个子问题,然后通过对这a个子间题的解的综合,得到原问题的解。

(4)差分方程法(Difference Formula Method)

可以将某些递归方程看成差分方程,通过解差分方程的方法来解递归方程,然后对解作出渐近阶估计。

下面就以上方法给出一些例子说明。

一、代入法

大整数乘法计算时间的递归方程为:T(n) = 4T(n/2) + O(n),其中T(1) = O(1),我们猜测一个解T(n) = O(n2 ),根据符号O的定义,对n>n0,有T(n) < cn2 - eO(2n)(注意,这里减去O(2n),因其是低阶项,不会影响到n足够大时的渐近性),把这个解代入递归方程,得到:

T(n) = 4T(n/2) + O(n)
≤ 4c(n/2)2 - eO(2n/2)) + O(n)
= cn2 - eO(n) + O(n)
≤ cn2

其中,c为正常数,e取1,上式符合 T(n)≤cn2 的定义,则可认为O(n2 )是T(n)的一个解,再用数学归纳法加以证明。

二、迭代法

某算法的计算时间为:T(n) = 3T(n/4) + O(n),其中T(1) = O(1),迭代两次可将右端展开为:

T(n) = 3T(n/4) + O(n)
= O(n) + 3( O(n/4) + 3T(n/42 ) )
= O(n) + 3( O(n/4) + 3( O(n/42 ) + 3T(n/43 ) ) )

从上式可以看出,这是一个递归方程,我们可以写出迭代i次后的方程:

T(n) = O(n) + 3( O(n/4) + 3( O(n/42 ) + ... + 3( n/4i + 3T(n/4i+1 ) ) ) )

当n/4i+1 =1时,T(n/4i+1 )=1,则

T(n) = n + (3/4) + (32 /42 )n + ... + (3i /4i )n + (3i+1 )T(1)
< 4n + 3i+1

而由n/4i+1 =1可知,i<log4 n,从而

3i+1 ≤ 3log4 n+1 = 3log3 n*log4 3 +1 = 3nlog4 3

代入得:

T(n) < 4n + 3nlog4 3,即T(n) = O(n)。

三、套用公式法

这个方法为估计形如:

T(n) = aT(n/b) + f(n)

其中,a≥1和b≥1,均为常数,f(n)是一个确定的正函数。在f(n)的三类情况下,我们有T(n)的渐近估计式:

1.若对于某常数ε>0,有f(n) = O(nlogb a-ε ),则T(n) = O(nlogb a )

2.若f(n) = O(nlogb a ),则T(n) = O(nlogb a *logn)

3.若f(n) = O(nlogb a+ε ),且对于某常数c>1和所有充分大的正整数n,有af(n/b)≤cf(n),则T(n)=O(f(n))。

设T(n) = 4T(n/2) + n,则a = 4,b = 2,f(n) = n,计算得出nlogb a = nlog2 4 = n2 ,而f(n) = n = O(n2-ε ),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2 )。

这里涉及的三类情况,都是拿f(n)与nlogb a 作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogb a 较大,则T(n)=O(nlogb a );在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogb a *logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。

但上述三类情况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogb a ,第二类与第三类之间也存在这种情况,此时公式法不适用。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/metasearch/archive/2009/08/09/4428865.aspx
温馨提示:内容为网友见解,仅供参考
无其他回答

算法的时间和空间复杂度如何衡量?
1.时间复杂度 算法的时间复杂度是指执行算法所需要的时间。一般来说,计算机算法是问题规模n 的函数f(n),算法的时间复杂度也因此记做。T(n)=Ο(f(n))因此,问题的规模n 越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度 2.空间复杂度 算法的空间复杂度是指算法需要...

估算算法时间复杂度的方法
则该算法的 时间复杂度:T(n)=O(n^3) 注:n^3即是n的3次方。

如何计算时间复杂度
1. 确定基本操作的数量:时间复杂度主要关注算法执行过程中基本操作的数量。基本操作通常指的是算法中最重复执行的操作。2. 分析操作的次数与问题规模的关系:对于不同的问题规模,算法的基本操作次数会如何变化?这是计算时间复杂度的关键。通常,问题规模用n表示,n是输入数据的数量或大小。3. 使用大O...

如何计算时间复杂度
根据基本操作的数量,可以分析算法的时间复杂度。对于不同的数据结构,如数组、链表、树等,以及不同的操作,如查找、排序等,有不同的时间复杂度分析方式。通常我们会用大写字母O来表示时间复杂度。对于特定的输入规模n,将基本操作的数量进行加权平均并转换为表达式,可以计算出一个表示算法执行时间与输入...

时间复杂度怎么快速算
可以使用大O符号表示时间复杂度的上界,从而对算法的运行时间进行快速估计。大O符号表示,对于足够大的输入规模,算法的运行时间不会超过一个常数乘以输入大小的某个函数。例如,若某算法的时间复杂度为O(n^2),则当输入规模n足够大时,算法的时间复杂度不会超过常数c乘以n平方。因此,时间复杂度的快速...

如何计算一个算法的时间复杂度
求解算法的时间复杂度的具体步骤是:⑴找出算法中的基本语句;算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。⑵计算基本语句的执行次数的数量级;只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂...

求时间复杂度
1、如何计算算法的时间复杂度 在计算算法时间复杂度时有以下几个简单的程序分析法则:1.对于一些简单的输入输出语句或赋值语句,近似认为需要O(1)时间 2.对于顺序结构,需要依次执行一系列语句所用的时间可采用大O下"求和法则"求和法则:是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n...

这个算法的时间复杂度是如何计算出来的?
如果采用这样的策略,这题是可以以O(N)实现的。如果不考虑上面所说,复杂度是NlogN,你的计算过程可行。另外也可估算,即单次求幂是logN,求N次就是NlogN,这样估出来的是上界。但是在不保留中间结果的算法下,是无法达成O(N)的,故可以不严谨地“直觉”知道下界也是NlogN。

如何计算时间复杂度
计算时间复杂度是评估算法执行时间随输入规模增长的增长率。通常通过分析算法中的循环、递归等操作来确定。可以使用大O符号表示,表示算法的最坏情况下的时间复杂度。计算时间复杂度时,需要考虑算法中每个操作的执行次数,并将其表示为输入规模的函数。然后,找到函数中的最高次项,忽略低次项和常数系数,...

数据结构:十分钟搞定时间复杂度(算法的时间复杂度)
数据结构中的时间复杂度分析是一种估算算法运行时间的重要工具。当我们讨论算法执行次数T(n)时,它表示随着输入大小n的增长,所需运算次数的增长速度。时间复杂度用O(f(n))表示,其中f(n)是一个函数,其增长速度大于或等于T(n)。例如,若T(n) = n + 2,而f(n) = n^2在n大于2时总是大于...

相似回答