算法的时间复杂度分析

来源:互联网 发布:海岛奇兵神庙升级数据 编辑:程序博客网 时间:2024/05/16 10:37

1.算法耗费的时间、语句频度、输入规模

在实际中,一个算法所需耗费的时间  =  算法中所有语句的执行时间之和
           而,每条语句的执行时间         =  每条语句执行一次所需时间  *  每条语句的执行次数(语句频度)

因为每条语句执行一次所需时间取决于机器执行指令的性能、速度等难以确定的因素,而为了独立于机器的软、硬件系统来分析算法的时间耗费,
我们假设每条语句执行一次所需时间均为单位时间,那么,一个算法的时间规模就与其所有语句的频度之和相关。

 

输入规模:算法求解问题的输入量称为问题的规模,一般用一整数来表示:n = 1, 2, 3 ...k


那么,对于输入规模为 n 的算法,其语句频度之和可记作:T(n)

例:
(1) for(i=0; i<n;j++) n+1
(2) for (j=0;j<n;j++) { n(n+1)
(3)     C[i][j]=0; n2
(4)     for (k=0; k<n; k++) n2(n+1)
(5)       C[i][j]=C[i][j]+A[i][k]*B[k][j]; n3

分析:
    语句(1)的循环控制变量i要增加到n,测试到i=n成立才会终止。故它的频度是n+1。但是它的循环体却只能执行n次。
    语句(2)作为语句(1)循环体内的语句应该执行n次,但语句(2)本身要执行n+1次,所以语句(2)的频度是n(n+1)。
    同理可得语句(3),(4)和(5)的频度分别是n2,n2(n+1)和n3。
    该算法中所有语句的频度之和(即算法的时间耗费)为:   T(n)=2n3+3n2+2n+1 (1.1)

2. 时间复杂度

概念:
    如某算法的语句频度之和为 T(n),那么,当 n 趋于无穷大虹,若存在函数 f(n)使得 T(n)/f(n)的极限值为不等于0的常数,
    则称:  f(n) 是 T(n) 的同数量级函数,记作:T(n) = O(f(n))
      称:  O(f(n)) 为该算法的渐进时间复杂度,简称:时间复杂度

举例说明时间复杂度的求法:

交换i和j的内容。
    Temp=i;
    i=j;
    j=temp;
  以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。
注意:
       如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
 
变量计数之一:
(1) x=0;y=0;
(2) for(k-1;k<=n;k++)
(3)   x++;
(4) for(i=1;i<=n;i++)
(5)     for(j=1;j<=n;j++)
(6)       y++;
  一般情况下,对步进循环语句只需考虑循环体中语句的执行次数,忽略该语句中步长加1、终值判别、控制转移等成分。
       因此,以上程序段中频度最大的语句是(6),其频度为f(n)=n2,所以该程序段的时间复杂度为T(n)=O(n2)。
  当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。

变量计数之二:
(1) x=1;
(2) for(i=1;i<=n;i++)
(3)     for(j=1;j<=i;j++)
(4)         for(k=1;k<=j;k++)
(5)             x++;
  该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,
        因此可以从内层循环向外层分析语句(5)的执行次数n3,得出该算法时间复杂度为T(n)=O(n3/6+低次项)=O(n3)。

注意: 
算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。

在数值A[0..n-1]中查找给定值K的算法大致如下:
(1)i=n-1;
(2)while(i>=0&&(A[i]!=k))
(3)   i--;
(4)return i;
       此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关:
①若A中没有与K相等的元素,则语句(3)的频度f(n)=n;
②若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。


3.最坏时间复杂度和平均时间复杂度
  最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。
    这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
    平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。
 
常见的时间复杂度按数量级递增排列依次为:
常数阶         O(1)
对数阶         O(log2n)
线性阶         O(n)
线性对数阶  O(nlog2n)
平方阶         O(n2)
立方阶         O(n3)

k次方阶       O(nk)
指数阶        O(2n)

 

原创粉丝点击