zoukankan      html  css  js  c++  java
  • 时间复杂度

    计算时,忽略掉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)。

  • 相关阅读:
    一、left
    padding溢出
    一、
    Python创建、删除桌面、启动组快捷方式的例子分享
    openstack常见问题解决方法总结
    __attribute__ 详解
    __ATTRIBUTE__ 知多少?
    CentOS如何设置终端显示字符界面区域的大小
    shell使用技巧
    openstack 安全策略权限控制等api接口
  • 原文地址:https://www.cnblogs.com/djzny/p/4642522.html
Copyright © 2011-2022 走看看