时间复杂度

计算时,忽略掉T(n)中的常量、低次幂和最高次幂的系数

复杂度与时间效率的关系:
c < log2n < n < n*log2n < n2 < n3 < 2n < 3n < n! (c是一个常量)
|--------------------------|--------------------------|-------------|
          较好                     一般              较差
其中c是一个常量,如果一个算法的复杂度为c 、 log2n 、n 、 n*log2n,那么这个算法时间效率比较高 ,如果是 2n , 3n ,n!,那么稍微大一些的n就会令这个算法不能动了,居于中间的几个则差强人意。

 

例子:

O(1)
交换i和j的内容
temp=i;
i=j;
j=temp;                   
以上三条单个语句的频度为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
O(n2)
    sum=0;                /* 执行次数1 */
    for(i=1;i<=n;i++)     
       for(j=1;j<=n;j++)
         sum++;       /* 执行次数n2 */
解:T(n) = 1 + n2 = O(n2)
   for (i=1;i<n;i++)
   {
       y=y+1;        ①  
       for (j=0;j<=(2*n);j++)   
          x++;        ②     
   }        
解:  语句1的频度是n-1
         语句2的频度是(n-1)*(2n+1) = 2n2-n-1
         T(n) = 2n2-n-1+(n-1) = 2n2-2
         f(n) = n2
         lim(T(n)/f(n)) = 2 + 2*(1/n2) = 2
         T(n) = O(n2).
O(n)   
   a=0;
   b=1;                     ①
   for (i=1;i<=n;i++) ②
   { 
      s=a+b;    ③
      b=a;     ④ 
      a=s;     ⑤
   }
解:  语句1的频度:2,       
         语句2的频度:n,       
         语句3的频度:n,       
         语句4的频度:n,   
         语句5的频度:n,                                 
         T(n) = 2+4n
         f(n) = n
         lim(T(n)/f(n)) = 2*(1/n) + 4 = 4
         T(n) = O(n).    
O(log2n)
   i=1;       ①
   while (i<=n)
      i=i*2; ②
解: 语句1的频度是1,
       设语句2的频度是t,  则:nt<=n;  t<=log2n
       考虑最坏情况,取最大值t=log2n,
        T(n) = 1 + log2n
        f(n) = log2n
        lim(T(n)/f(n)) = 1/log2n + 1 = 1
        T(n) = O(log2n)
O(n3)
   for(i=0;i<n;i++)
   {
      for(j=0;j<i;j++)
      {
         for(k=0;k<j;k++)
            x=x+2;
      }
   }
解:当i=m, j=k的时候,内层循环的次数为k当i=m时, j 可以取 0,1,...,m-1 ,  所以这里最内循环共进行了0+1+...+m-1=(m-1)m/2次所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/2次
T(n) = n(n+1)(n-1)/2 = (n3-n)/2
f(n) = n3
所以时间复杂度为O(n3)。

posted @ 2015-07-13 12:02  Djzny  阅读(204)  评论(0编辑  收藏  举报