定義
在計算機科學中,算法的 時間複雜度是一個函式,它定性描述了該算法的運行時間。這是一個關於代表算法輸入值的字元串的長度的函式。時間複雜度常用大O符號表述,不包括這個函式的低階項和首項係數。
算法複雜度
算法複雜度分為時間複雜度和空間複雜度。其作用: 時間複雜度是指執行算法所需要的計算工作量;而空間複雜度是指執行這個算法所需要的記憶體空間。(算法的複雜性體現在運行該算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資源,因此複雜度分為時間和空間複雜度)。
時間複雜度
計算方法
1.一般情況下,算法中基本操作重複執行的次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得T(n)/f(n)的極限值(當n趨近於無窮大時)為不等於零的常數,則稱f(n)是T(n)的同數量級函式。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間複雜度,簡稱時間複雜度。
分析:隨著模組n的增大,算法執行的時間的增長率和 f(n) 的增長率成正比,所以 f(n) 越小,算法的時間複雜度越低,算法的效率越高。
2. 在計算時間複雜度的時候,先找出算法的基本操作,然後根據相應的各語句確定它的執行次數,再找出 T(n) 的同數量級(它的同數量級有以下:1,logn,n,n logn ,n的平方,n的三次方,2的n次方,n!),找出後,f(n) = 該數量級,若 T(n)/f(n) 求極限可得到一常數c,則時間複雜度T(n) = O(f(n))
例:算法:
![時間複雜度](/img/f/232/wZwpmLwATNzcDO4EDMyMzM1UTM1QDN5MjM5ADMwAjMwUzLxAzLzYzLt92YucmbvRWdo5Cd0FmLxE2LvoDc0RHa.jpg)
則有,根據上面括弧里的同數量級,我們可以確定 n的三次方 為T(n)的同數量級
![時間複雜度](/img/3/1dc/wZwpmLxcDM2ADN4UzMxMzM1UTM1QDN5MjM5ADMwAjMwUzL1MzL0czLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
則有,然後根據 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)。
分類
按數量級遞增排列,常見的時間複雜度有:
![時間複雜度](/img/3/5ad/wZwpmLyQzN5YTN1EDNxMDN0UTMyITNykTO0EDMwAjMwUzLxQzL2IzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
常數階O(1),對數階O(),線性階O(n),
線性對數階O(nlog2n),平方階O(n^2),立方階O(n^3),...,
k次方階O(n^k),指數階O(2^n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,算法的執行效率越低。
關於對其的理解
《數據結構(C語言版)》 ------嚴蔚敏 吳偉民編著 第15頁有句話“整個算法的執行時間與基本操作重複執行的次數成正比。”
基本操作重複執行的次數是問題規模n的某個函式f(n),於是算法的時間量度可以記為:T(n) = O(f(n))
如果按照這么推斷,T(n)應該表示的是算法的時間量度,也就是算法執行的時間。
而該頁對“語句頻度”也有定義:指的是該語句重複執行的次數。
如果是基本操作所在語句重複執行的次數,那么就該是f(n)。
上邊的n都表示的問題規模。