时间复杂度分析
2017-08-13 17:28
134 查看
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:
(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<log4n,从而
3i+1 ≤ 3log4n+1 = 3log3n*log43+1 = 3nlog43
代入得:
T(n) < 4n + 3nlog43,即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(nlogba-ε),则T(n) = O(nlogba)
2.若f(n) = O(nlogba),则T(n) = O(nlogba*logn)
3.若f(n) = O(nlogba+ε),且对于某常数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,计算得出nlogba = nlog24 = n2,而f(n) = n = O(n2-ε),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2)。
这里涉及的三类情况,都是拿f(n)与nlogba作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogba较大,则T(n)=O(nlogba);在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogba*logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。
但上述三类情况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogba,第二类与第三类之间也存在这种情况,此时公式法不适用。
在一秒内机器能解决最大规模n
(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<log4n,从而
3i+1 ≤ 3log4n+1 = 3log3n*log43+1 = 3nlog43
代入得:
T(n) < 4n + 3nlog43,即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(nlogba-ε),则T(n) = O(nlogba)
2.若f(n) = O(nlogba),则T(n) = O(nlogba*logn)
3.若f(n) = O(nlogba+ε),且对于某常数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,计算得出nlogba = nlog24 = n2,而f(n) = n = O(n2-ε),此时ε= 1,根据第1种情况,我们得到T(n) = O(n2)。
这里涉及的三类情况,都是拿f(n)与nlogba作比较,而递归方程解的渐近阶由这两个函数中的较大者决定。在第一类情况下,函数nlogba较大,则T(n)=O(nlogba);在第三类情况下,函数f(n)较大,则T(n)=O(f (n));在第二类情况下,两个函数一样大,则T(n)=O(nlogba*logn),即以n的对数作为因子乘上f(n)与T(n)的同阶。
但上述三类情况并没有覆盖所有可能的f(n)。在第一类情况和第二类情况之间有一个间隙:f(n)小于但不是多项式地小于nlogba,第二类与第三类之间也存在这种情况,此时公式法不适用。
在一秒内机器能解决最大规模n
运算量 | n! | 2的n次幂 | n的三次方 | n的平方 | nlog2(n) | n |
最大规模 | 11 | 26 | 464 | 10000 | 4.5*10e6 | 100000000 |
速度扩大两倍后 | 11 | 27 | 584 | 14142 | 8.6*10e6 | 200000000 |
相关文章推荐
- 时间复杂度标记与分析(算法分析与设计)
- 快速排序算法及时间复杂度分析(原地in-place分区版本)
- 分治法和二分法的时间复杂度简明分析
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 算法的时间复杂度分析
- 斐波那契数列递归算法和非递归算法以及其时间复杂度分析
- 归并排序实现及时间复杂度分析
- 递归算法的时间复杂度分析[转]
- 递归树分析递归算法的时间复杂度
- 对高效率素数求解算法进行时间复杂度分析
- 约瑟夫问题的数学角度分析 C 数组实现 循环链表实现 递归实现时间复杂度O(logN)
- 桶排序与带循环的算法时间复杂度分析
- 数组建堆时间复杂度分析
- 数据结构回顾——时间复杂度分析
- 常用排序算法稳定性、时间复杂度分析(转,有改动)
- 关于希尔排序的时间复杂度分析
- 归并排序的分治算法与时间复杂度分析
- ACM算法-时间复杂度分析(4.有关时间复杂度循环的分析)
- 面试中的时间复杂度分析
- 算法——时间复杂度分析方法