时间复杂度

来源:互联网 发布:邓肯数据统计历史排名 编辑:程序博客网 时间: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= 1while (i <= n)      //循环次数为1 + logn, O(logn)    i = i*2;

3、计算方法

  1. 先找出基本的操作;
  2. 找到各语句执行次数;
  3. 然后将各个语句时间复杂度相加。
  4. 最后转换为大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
  其递归树如下图所示:

0 0
原创粉丝点击