經常使用算法時間複雜度的計算方法

1. 時間複雜度 算法

  時間複雜度是指程序運行從開始到結束所須要的時間。時間複雜度的計算通常比較麻煩,故在數據結構的研究中不多說起時間複雜度。爲了便於比較同一個問題的不一樣算法,一般作法是,從算法中選取一種對於所研究的問題來講是基本操做的原操做,以該基本操做重複執行的次數作爲算法的時間量度。基本操做應是其重複執行次數和算法時間成正比的原操做,多數狀況下它是最深層循環內的語句中的操做。算法的執行次數還要隨輸入集有關,此時要考慮全部可能輸入數據的指望值,此時的算法時間複雜度叫平均時間複雜度。有事平均時間複雜度難以肯定,此時分析最壞狀況下算法的一個上界,此時稱爲最壞時間複雜度。 數據結構

2. 時間複雜度的表示方法 函數

  設解決一個問題的規模爲n,基本操做被重複執行次數是n的一個函數f(n),則時間複雜度可記做: T(n)=O(f(n)) 它表示隨着問題規模n的增加,算法執行時的增加率和f(n)的增加率相同。其中T(n)叫算法的漸進時間複雜度,簡稱時間複雜度。算法的時間複雜度考慮的只是對於問題規模n的增加率,則在難以精確計算的狀況下,只需考慮它關於n的增加率或階便可。 spa

  例如 code

 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)blog

3. 時間複雜度的計算方法 class

  時間複雜的推導方法通常以下: 循環

  第一步:用常數1取代運行時間中的全部加法常數。程序

  第二步:在修改後的運行次數函數中,只保留最高階項。 方法

  第三步:若是最高階項存在且不是1,則去除與這個項相乘的常數。

  時間複雜度通常分爲如下幾種,分別是:

  (1)常數階 首先順序結構的時間複雜度。 

main() { 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)的程序步驟序列*/ }

  (3)對數階

int count=1; while(count<n) { count=count*2; /*時間複雜度爲O(1)的程序步驟序列*/} 
  因爲每次count乘以2以後,就距離n更近了一點。也就是說,有多少個2相乘後大於n,則會退出循環。由2x=n獲得x=log2n。因此這個循環的時間複雜度爲O(log2n)。 
(4)平方階
inti,j; 
for(i=0;i<n;i++)
{ 
    for(j=0;j<n;j++)
    { /*時間複雜度爲O(1)的程序步驟序列*/
     }
} 
 
循環的時間複雜度等於循環體的複雜度乘以該循環運行的次數。間複雜度爲O(n2)。

4. 總結

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

相關文章
相關標籤/搜索