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

 

常见的时间复杂度

                                              

                                      

 

posted on 2013-05-17 20:26  贞心真义  阅读(2106)  评论(3编辑  收藏  举报