算法时间复杂度的计算方法

1. 时间复杂度

  时间复杂度是指程序运行从开始到结束所须要的时间。时间复杂度的计算通常比较麻烦,故在数据结构的研究中不多说起时间复杂度。为了便于比较同一个问题的不一样算法,一般作法是,从算法中选取一种对于所研究的问题来讲是基本操做的原操做,以该基本操做重复执行的次数作为算法的时间量度。基本操做应是其重复执行次数和算法时间成正比的原操做,多数状况下它是最深层循环内的语句中的操做。算法的执行次数还要随输入集有关,此时要考虑全部可能输入数据的指望值,此时的算法时间复杂度叫平均时间复杂度。有事平均时间复杂度难以肯定,此时分析最坏状况下算法的一个上界,此时称为最坏时间复杂度。算法

2. 时间复杂度的表示方法

  设解决一个问题的规模为n,基本操做被重复执行次数是n的一个函数f(n),则时间复杂度可记做: T(n)=O(f(n)) 它表示随着问题规模n的增加,算法执行时的增加率和f(n)的增加率相同。其中T(n)叫算法的渐进时间复杂度,简称时间复杂度。算法的时间复杂度考虑的只是对于问题规模n的增加率,则在难以精确计算的状况下,只需考虑它关于n的增加率或阶便可。json

  例如 数据结构

{

 for(i=2;i<=n;++i)
   for(j=2;j<=i-1;++j)
   {
    ++x;
    a[i,j]=x;
   }
}

  其中++x语句频度为:1+2+3+…+n-2=(n-1)(n-2)/2=(n2-3n+2)/2故算法的时间复杂度可表示为:T(n)=O(n2)函数

3. 时间复杂度的计算方法

  时间复杂的推导方法通常以下:code

  第一步:用常数1取代运行时间中的全部加法常数。class

  第二步:在修改后的运行次数函数中,只保留最高阶项。循环

  第三步:若是最高阶项存在且不是1,则去除与这个项相乘的常数。程序

  时间复杂度通常分为如下几种,分别是:方法

(1)常数阶 首先顺序结构的时间复杂度。

{
      int sum=0,n=100;
      sum=(1+n)*n/2;
      printf(“%d”,sum);

}

算法的时间复杂度为O(1)。 这个算法的运行次数函数是f(n)=3。根据咱们推导的方法,第一步就是把常数项3改成1。在保留最高阶项时发现,它根本没有最高阶项,因此这个算法的时间复杂度为O(1)。总结

(2)线性阶

要肯定某个算法的阶次,须要肯定某个特定语句或某个语句集运行的次数。所以,要分析算法的复杂度,关键就是要分析循环结构的运行状况。

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

该循环会执行n次 因此这个循环的时间复杂度为O(n)

(3)对数阶

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

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

(4)平方阶

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

循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。间复杂度为O(n2)。

4.总结

  本文主要讨论算法的时间复杂度,算法时间复杂度在数据结构中是比较难的问题,经过本文给出的计算时间复杂度的方法,可以比较容易掌握时间复杂的计算。

相关文章
相关标签/搜索