时间复杂度分析:递归算法

递归算法中的时间复杂度有好几种解法,在我看来,最容易掌握的是迭代法和递归树法,这就列出这两种

迭代法:

*** 从原始递推方程开始,反复将对于递推方程左边的函数用右边的等式代入,直到得到初值,然后将所得的结果进行化简。

例如在调用归并排序mergeSort(a,0,n-1)对数组a[0…n−1]a[0…n−1]排序时,执行时间T(n)T(n)的递推关系式为:
《时间复杂度分析:递归算法》
其中,O(n)为merge()所需要的时间,设为cn(c为正常量)。因此:
《时间复杂度分析:递归算法》
类似的,我们也可以用迭代法求解汉诺塔递归求解时的时间复杂度。但遗憾的是,迭代法一般适用于一阶的递推方程。对于二阶及以上(即T(n)依赖它前面更多个递归项T(n)依赖它前面更多个递归项)的递推方程,迭代法将导致迭代后的项太多,从而使得求和公式过于复杂,因此需要将递推方程化简,利用差消法等技巧将高阶递推方程化为一阶递推方程。如在求快速排序算法平均时间复杂度T(n)的递推方程,T(n)依赖T(n−1)、T(n−2)、…、T(1)T(n−1)、T(n−2)、…、T(1)等所有的项,这样的递推方程也称为全部历史递推方程。

递归树法:

***递归树是一棵结点带权值的树。初始的递归树只有一个结点,它的权标记为T(n);然后按照递归树的迭代规则不断进行迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1))。

迭代规则:第一步: 把根结点T(n)用根是cn、左结点为T(n/2)、右结点为T(n/2)的子树代替(即:以分解、合并子问题需要的代价为根,分解得到的子问题为叶的子树。其中常量c代表求解规模为1的问题所需的时间);(如下如(a)→(b))
第二步:把叶结点按照“第一步”的方式展开;T(n/2)用根是cn/2、左节点为T(n/4)右结点为T(n/4)的子树代替。(如下如(b)→©)
第三步:反复按照“第一步”的方式迭代,每迭代一次递归树就增加一层,直到树中不再含有权值为函数的结点(即叶结点都为T(1))。(如下如©→(d))

例如:
《时间复杂度分析:递归算法》
画出如下图:
《时间复杂度分析:递归算法》
在得到递归树后,将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价。在上图(d)部分中,完全展开的递归树高度为lgn(树高为根结点到叶结点最长简单路径上边的数目),所有递归树具有lgn+1,所以总代价为cn∗(lgn+1),所有时间复杂度为Θ(nlgn)

    原文作者:递归算法
    原文地址: https://blog.csdn.net/huayyu/article/details/80515647
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞