求递归算法时间复杂度:递归树【待研究】
来源:互联网 发布:c语言阶乘函数 编辑:程序博客网 时间:2024/05/24 05:04
转载自求递归算法时间复杂度:递归树
递归算法时间复杂度的计算方程式一个递归方程:
在引入递归树之前可以考虑一个例子:
T(n) = 2T(n/2) + n2
迭代2次可以得:
T(n) = n2 + 2(2T(n/4) + (n/2)2)
还可以继续迭代,将其完全展开可得:
T(n) = n2 + 2((n/2) 2 + 2((n/22)2 + 2((n/23)2 + 2((n/24)2 +…+2((n/2i)2 + 2T(n/2i + 1)))…)))) ……(1)
而当n/2i+1 == 1时,迭代结束。
将(1)式小括号展开,可得:
T(n) = n2 + 2(n/2)2 + 22(n/22)2 + … + 2i(n/2i)2 + 2i+1T(n/2i+1)
这恰好是一个树形结构,由此可引出递归树法。
图中的(a)(b)(c)(d)分别是递归树生成的第1,2,3,n步。每一节点中都将当前的自由项n2留在其中,而将两个递归项T(n/2) + T(n/2)分别摊给了他的两个子节点,如此循环。
图中所有节点之和为:
[1 + 1/2 + (1/2)2 + (1/2)3 + … + (1/2)i] n2 = 2n2
可知其时间复杂度为O(n2)
可以得到递归树的规则为:
(1) 每层的节点为T(n) = kT(n / m) + f(n)中的f(n)在当前的n/m下的值;
(2) 每个节点的分支数为k;
(3)每层的右侧标出当前层中所有节点的和。
再举个例子:
T(n) = T(n/3) + T(2n/3) + n
其递归树如下图所示:
可见每层的值都为n,从根到叶节点的最长路径是:
因为最后递归的停止是在(2/3)kn == 1.则
于是
即T(n) = O(nlogn)
总结,利用此方法解递归算法复杂度:
f(n) = af(n/b) + d(n)
1.当d(n)为常数时:
2.当d(n) = cn 时:
3.当d(n)为其他情况时可用递归树进行分析。
由第二种情况知,若采用分治法对原算法进行改进,则着重点是采用新的计算方法缩小a值。
- 求递归算法时间复杂度:递归树【待研究】
- 求递归算法时间复杂度:递归树
- 求递归算法时间复杂度:递归树
- 求递归算法时间复杂度:递归树
- 求递归算法时间复杂度:递归树
- 求递归算法时间复杂度:递归树
- 递归树求递归算法时间复杂度
- 求递归算法时间复杂度:递归树
- 求递归算法时间复杂度:递归树
- (转)递归树求递归算法的时间复杂度
- 递归算法时间复杂度_递归树
- 递归算法时间复杂度
- 递归算法时间复杂度
- <算法导论>学习笔记(3)--递归树求递归算法时间复杂度
- 求递归式时间复杂度
- 递归树求解递归算法的时间复杂度
- 递归树求解递归算法的时间复杂度
- 递归树求解递归算法的时间复杂度
- centos7 设置字体大小
- 聚簇索引和非聚簇索引
- LEETCODE-Ugly Number
- Oracle数据库修改字段长度
- 第十三章 时间序列分析和预测
- 求递归算法时间复杂度:递归树【待研究】
- 《IOS_C语言》函数指针、函数回调、动态排序、函数返回值是函数指针
- 整数的个数
- 面试题26:复杂链表复制
- OSSchedLock()函数透析 转自:跳跳盆盆——博客园http://www.cnblogs.com/pengwangguoyh/p/4446024.html
- 解决VS2010链接错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- C#中的线程(二) 线程同步基础
- 采样示波器和实时示波器的原理与各自优势
- 例题6.20 信息解密 UVa1457