递归算法的时间复杂度分析
在算法分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化为一个递归方程求解。实际上,这个问题是数学上求解渐近阶的问题,而递归方程的形式多种多样,其求解方法也是不一而足,比较常用的有以下四种方法:
(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 ,第二类与第三类之间也存在这种情况,此时公式法不适用。
转自:青青的专栏--C/C++ OOA/D Design Pattern
http://blog.csdn.net/metasearch/archive/2009/08/09/4428865.aspx
分享到:
相关推荐
关于递归算法时间复杂度分析的探讨,是一个深入理解算法效率和优化的关键议题。递归,作为解决问题的一种强大工具,其本质是将复杂问题分解为更简单的子问题,通过求解这些子问题来达到最终解决方案的目的。然而,...
本文主要探讨了Java中几种常见的排序算法(冒泡排序、选择排序、插入排序、希尔排序)以及递归算法的时间复杂度分析。通过具体代码示例和理论分析,帮助读者理解不同排序算法的特点及其在实际应用中的性能表现。 ##...
对于非递归算法来说,时间复杂度的分析相对直观,而对于递归算法,由于其自身的调用特性,分析起来更为复杂。递归算法是一种常见的程序设计方法,它通过函数调用自身来解决问题。 递归算法在执行过程中会产生大量的...
### 算法时间复杂度分析中递归方程求解方法综述 #### 引言 在计算机科学领域,递归是一种常见的编程思想和技术,它不仅被广泛应用于各种算法的设计之中,也是评估算法效率的重要工具之一。递归方程在算法的时间...
本篇文章将深入探讨四种基本的排序算法:冒泡排序、选择排序、插入排序以及希尔排序,并结合递归算法的复杂度进行分析。这些排序算法在不同的场景下有不同的效率表现,理解它们的原理和复杂度可以帮助我们更好地选择...
用非递归解决八皇后的问题,是经典的非递归算法,学习数据结构中很有用
递归算法与循环算法的分析 递归算法是指在程序设计中,在调用一个函数...8. 递归算法和循环算法在二分查找算法中的应用:递归算法和循环算法的时间复杂度都为 O(logn),但是循环算法的空间复杂度较低,且更容易实现。
用递推关系理论分析递归算法的时间复杂度 递归算法是算法设计中常用的技术,但对递归算法的时间复杂度分析却是困难的。用组合数学中的递推关系理论可以分析递归算法的时间复杂度。本文提出用递推关系理论分析递归...
以下是对选择排序、冒泡排序、归并排序、快速排序和插入排序这五种常见排序算法的详细介绍,以及如何分析它们的时间复杂度。 1. **选择排序(Selection Sort)** - 原理:选择排序是一种简单直观的排序算法,它...
算法复杂度分析是评估算法效率的重要工具,主要涉及时间复杂度和空间复杂度两个方面。这门基础课程旨在教授如何分析算法在处理大规模数据时所需的资源,帮助开发者优化程序性能。 一、算法复杂度的概念 1. 时间...
根号n段归并排序算法是一种优化过的归并排序策略,它的主要目标是减少比较和交换操作的次数,从而在处理大数据集时提高效率。...理解其工作原理和时间复杂度分析有助于我们在实际应用中选择合适的排序算法。
算法讲解018【入门】二叉树遍历的非递归实现和复杂度分析
### 排序算法时间复杂度的研究 #### 引言 排序是计算机科学中的基础操作之一,主要用于对数据集中的元素按照特定的顺序进行排列。排序算法的效率直接关系到计算机程序的整体性能。根据数据是否完全加载到内存中,...
本文将探讨递归树的构建方式,以及如何通过递归树来分析归并排序和快速排序这两种排序算法的时间复杂度。 首先,让我们回顾一下排序算法中递归的基本应用。在归并排序中,算法将一个大的数组分解为两个小的数组进行...
算法设计与分析——时间复杂度 算法设计与分析是计算机科学中的一门重要课程,旨在研究和分析算法的设计、实现和优化。时间复杂度是算法设计与分析的核心概念之一,指的是算法执行所需的时间成本。了解时间复杂度...
理解并分析算法的时间复杂度有助于优化程序性能。 接着是**0-1背包问题**,这是一个经典的组合优化问题。在0-1背包问题中,我们有一个容量有限的背包,里面装有不同重量和价值的物品,目标是在不超过背包总容量的...
递归方程组解的渐进阶的求法是计算机科学与技术中分析算法效率的重要手段,特别是对于理解和优化算法的时间复杂度具有关键作用。在分析递归算法时,我们通常关注在最坏情况下的时间复杂性,这涉及到对递归方程解的...
本资料包“分析算法时间复杂度.zip”可能是为了教授如何理解和分析不同算法的时间复杂度,以便优化代码性能。我们将深入探讨这个主题。 首先,时间复杂度是一个函数,通常用大O符号表示,用来估算算法在最坏情况下...
- 主定理是分析递归算法时间复杂度的一种强大工具,尤其适用于形如`T(n) = aT(n/b) + f(n)`的递归方程。其中,a是每次递归调用的子问题数量,b是子问题规模缩小的比例,f(n)是基本操作的数量。 - 主定理提供了三个...