時間複雜度

時間複雜度

時間頻度

一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個算法都上機測試,只需知道哪個算法花費的時間多,哪個算法花費的時間少就可以了。並且一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱爲語句頻度或時間頻度。記爲T(n)。

計算方法

1. 一般情況下,算法的基本操作重複執行的次數是模塊n的某一個函數f(n),因此,算法的時間複雜度記做:T(n)=O(f(n))
分析:隨着模塊n的增大,算法執行的時間的增長率和 f(n) 的增長率成正比,所以 f(n) 越小,算法的時間複雜度越低,算法的效率越高。
2. 在計算時間複雜度的時候,先找出算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出 T(n) 的同數量級(它的同數量級有以下:1,log(2)n,n,n log(2)n ,n的平方,n的三次方,2的n次方,n!),找出後,f(n) = 該數量級,若 T(n)/f(n) 求極限可得到一常數c,則時間複雜度T(n) = O(f(n))
例:算法:
1
2
3
4
5
6
7
8
9
for (i=1;i<=n;++i)
{
    for (j=1;j<=n;++j)
    {
        c[i][j]=0;     //該步驟屬於基本操作 執行次數:n的平方 次
        for (k=1;k<=n;++k)   
           c[i][j] += a[i][k]*b[k][j]; //該步驟屬於基本操作 執行次數:n的三次方 次
    }
}
則有 T(n) = n 的平方+n的三次方,根據上面括號裏的同數量級,我們可以確定 n的三次方 爲T(n)的同數量級
則有 f(n) = n的三次方,然後根據 T(n)/f(n) 求極限可得到常數c
則該算法的時間複雜度:T(n) = O(n^3) 注:n^3即是n的3次方。
3.在pascal中比較容易理解,容易計算的方法是:看看有幾重for循環,只有一重則時間複雜度爲O(n),二重則爲O(n^2),依此類推,如果有二分則爲O(logn),二分例如快速冪、二分查找,如果一個for循環套一個二分,那麼時間複雜度則爲O(nlogn)。

分類

按數量級遞增排列,常見的時間複雜度有:
常數階O(1),對數階O(log2n),線性階O(n),
線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,
k次方階O(n^k),指數階O(2^n)。隨着問題規模n的不斷增大,上述時間複雜度不斷增大,算法的執行效率越低。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章