时间复杂度
来源:互联网 发布:邓肯数据统计历史排名 编辑:程序博客网 时间:2024/06/03 23:35
1、什么是时间复杂度
时间复杂度是某个算法的时间消耗,他是该算法所求问题规模n的函数。而渐进时间复杂度是指当问题规模趋向于无穷大时,该算法时间复杂度的数量级。通常我们在计算的算法的时间复杂度为T(n)=O(f(n)).通常我们总是考虑最坏情况下的时间复杂度
常见的时间复杂度有:常数O(1),对数O(logn),线性O(n),O(nlogn),平方O(n^2),k次方O(n^k),指数O(2^n)
2、时间复杂度例子
for (i = 0; i < n; ++i) //循环次数为n^2次,O(n^2) for (j = 0; j < n; ++j) sum += a[i][j]
i= 1;while (i <= n) //循环次数为1 + logn, O(logn) i = i*2;
3、计算方法
- 先找出基本的操作;
- 找到各语句执行次数;
- 然后将各个语句时间复杂度相加。
- 最后转换为大O计法(和高等数学里的无穷小和无穷大相似)
4、递归时间复杂度
reference
1. http://www.cnblogs.com/jy02414216/archive/2012/08/10/2633071.html
2. http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html
当一个算法里面包含递归时,计算复杂度的问题或转化为求解递归方程的问题。
常用的解法有如下几种:
迭代法:
迭代地将递归方程展开,使之成为一个非递归的和式,然后通过对和式的估计来达到对方程左端即方程的解的估计。
举例
某算法的计算时间为: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
T(n) = n + (3/4) + (32 /42 )n + … + (3i /4i )n + (3i+1 )T(1) < 4n + 3i+1
而由n/4i+1 =1可知,i
递归树:
举例1
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)每层的右侧标出当前层中所有节点的和。
举例2
T(n) = T(n/3) + T(2n/3) + n
其递归树如下图所示:
- 时间复杂度,空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度 & 空间复杂度
- 时间复杂度、空间复杂度
- 时间复杂度 空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度/空间复杂度
- 时间复杂度+空间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 拓扑排序
- libcurl在嵌入式设备C 的使用
- addclass()和多类选择器结合使用提高代码规范
- MKMapView的Span和Region深入分析
- AndroidStudio 在Resolve Error窗体上Failed to import new Gradle projec
- 时间复杂度
- EasyUI修改DateBox和DateTimeBox的默认日期格式
- 大话设计模式java版本 第二章 策略模式
- 树——sum-root-to-leaf-numbers
- 旧网站(java版本)永久301跳转到新网站(asp.net版本)
- 【友盟V5.0】微信登陆后,返回的usid为空
- Word2007中怎样删除空白页 PDF空白页如何删除
- vim 配置(ma6174 + YCM)
- NYOJ 914 Yougth的最大化(贪心,二分)