算法時間複雜度的計算方法

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.總結

  本文主要討論算法的時間複雜度,算法時間複雜度在數據結構中是比較難的問題,經過本文給出的計算時間複雜度的方法,可以比較容易掌握時間複雜的計算。

相關文章
相關標籤/搜索