• 软考难点—算法时间的复杂度


    推导大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)所以总结得出,循环的时间复杂度等于循环体的复杂度乘以该循环的运行的次数。

    常见的时间复杂度

                                                  

                                          

  • 相关阅读:
    Android 平板模拟器内存修改
    UI设计另类,创意的网站和App 集合(持续更新)
    Android平台根据分辨率计算屏幕尺寸,基于物理尺寸来验证手机和平板应用合并的可行性
    shape和selector的结合使用
    RGB浅谈
    Android开发大牛们的博客地址(持续更新)
    解决ViewPager添加点击监听器无触发的问题
    VC 输出闪烁的字母
    计算机体系结构精要
    Xmanager远程连接Ubuntu,窗口无法输入字母'd'
  • 原文地址:https://www.cnblogs.com/jyh317/p/3084124.html
Copyright © 2020-2023  润新知