1. 程式人生 > >時間複雜度總結

時間複雜度總結

演算法的效率

效率指的是演算法執行的時間。對於同一個問題如果有多個演算法可以解決,執行時間短的演算法效率更高。但同一個演算法用不同的語言實現,或者用不同的編譯環境進行編譯,或者在不同的計算機上執行時,效率均不同。這說明用絕對的時間單位衡量演算法的效率是不合適的。
所以我們可以用演算法中基本操作重複執行的次數來衡量一個演算法的好壞

時間複雜度

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式f(n),演算法的時間量度記作

                             T(n)=O(f(n))

它表示隨問題規模n的增大,演算法執行時間的增長率和f(n)的增長率相同,稱做演算法的漸進時間複雜度,簡稱時間複雜度。
我們來看一個程式。

void Test(int n)
{
     int iCount = 0;
     for(int i = 0; i < n; ++i)
     {
          for(int j = 0; j < n; ++j)
          {
               iCount++;
          }
     }
}
     for(int l = 0;k < 2*n; ++k)
     {
          iCount++;
     }
     int count = 10;
     while(count--)
     {
         iCount++;
     }             

語句總執行次數:

f ( n ) = n 2 + 2
n + 1

時間複雜度實際就是一個函式,該函式計算的是執行基本操作的次數

演算法分析的分類

演算法存在最好、平均和最壞情況:

  • 最壞情況:任意輸入規模的最大執行次數(上界)
  • 平均情況:任意輸入規模的期望執行次數
  • 最好情況:任意輸入規模的最小執行次數,通常最好情況不會出行(下界)
    例如:在一個長度為N的線性表中搜索一個數據x

  • 最好情況:1次比較

  • 最壞情況:N次比較
  • 平均情況:N/2次比較

在實際中通常關注的是演算法的最壞執行情況,即:任意輸入規模N,演算法的最長執行時間。理由如下:

  • 一個演算法的最壞情況的執行時間是在任意輸入下的執行上界
  • 對於某些演算法,最壞的情況出現的較為頻繁
  • 大體上看,平均情況與最壞情況一樣差

因此:一般情況下使用O漸進表示法來計算演算法的時間複雜度

時間複雜度之大 O漸進表示法

一個演算法語句總的執行次數是關於問題規模N的某個函式,記為f(N),N稱為問題的規模。語句總的執行次數記為T(N),當N不斷變化時,T(N)也在變化,演算法執行次數的增長速率和f(N)的增長率相同。則有T(N)=O(f(N)),稱為時間複雜度的漸進表示法。

一般演算法O(n)計算方法:

  • 用常數1取代執行時間中的所有加法常數
  • 在修改後的執行次數函式中,只保留最高階項
  • 如果最高階項數存在且不是1,則去除與這個專案相乘的常數