zoukankan      html  css  js  c++  java
  • 软考难点—算法时间的复杂度

    推导大O阶的方法

    1、用常熟1取代运行时间中的所有加法常数。

    2、在修改后的运行次数函数中,只保留最高阶项。

    3、如果最高阶项存在且不为1,则去除与这个项相乘的常数。

    应用:

    ①常数阶

    int sum=0,n=1000;
    sum=(1+n)*n/2;
    printf("%d",sum);

      以上是顺序结构的时间复杂度,这个算法的运行次数函数是f(n)=3。根据上面的方法,第一部就是把常数改成1,。在保留最高阶时发现,它根本没有最高阶项,所以它的时间复杂度是O(1)。

      对于分支结构而言,无论是真,还是假,执行的次数都是恒定的,不会随着n的变化而发生变化,所以单纯的分支结构(不包含在循环结构中),其时间复杂度也是O(1)。

    ②线性阶

    要分析算法的复杂度,关键就是要分析循环结构的运行情况。

    int i;
    for(i=0;i<n;i++)
        {
           /*时间复杂度为O(1)的程序步骤序列*/      
        }

    上面的代码,它的时间复杂度是O(n),因为循环体中的代码需要执行n次。

    ③对数阶

    int count=1;
    while (count < n)
    {
       count=count * 2;
       /*时间复杂度为O(1)的程序步骤序列*/        
    }

      由于每次count乘以2之后,就距离n更近了一分。也就是说,有多少个2相乘后大于n,则会退出循环。又2x=n 得到x=log2n。所以找个循环的时间复杂度为O(logn)。

    ④平方阶

    下面的代码是一个循环嵌套,根据上面的分析,内循环的时间复杂度为O(n)

    int i ,j;
    for(i=0;i<n;i++)
    {
       for(j=0;j<n;j++)
       {
          /*时间复杂度为O(1)的程序步骤序列*/
       }    
    }

    对于外部的循环,不过是内部的循环又循环了n次,所以这段代码的时间复杂度为O(n2)。

    如果外循环的次数改成了m,即

    int i ,j;
    for(i=0;i<m;i++)
    {
       for(j=0;j<n;j++)
       {
          /*时间复杂度为O(1)的程序步骤序列*/
       }    
    }

    那么时间复杂度就是O(m×n)所以总结得出,循环的时间复杂度等于循环体的复杂度乘以该循环的运行的次数。

    常见的时间复杂度

                                                  

                                          

  • 相关阅读:
    jquery插件实现瀑布流
    mysql explain亲测
    html5 audio标签微信部分苹果手机不能自动播放音乐终极解决方案
    mysql主从复制笔记
    mysql主从复制报错解决方案
    php form表单ajax上传图片方法
    Android webView 正确的用法
    【博弈】【HDU】取石子游戏
    Gleb And Pizza CodeForces
    Kirill And The Game CodeForces
  • 原文地址:https://www.cnblogs.com/jyh317/p/3084124.html
Copyright © 2011-2022 走看看