時間復雜度定義
在進行算法分析時,語句總的執行次數T(n) 是關於問題規模n 的函數,進而分析T(n)隨n 的變化情況而確定T(n)的數量級。
算法的時間復雜度,也就是算法的時間量度,記作T(n) = O(f(n))。它表示隨問題規模n 的增大,算法執行時間的增長率和
f(n) 的增長率相同。f(n) 是問題規模n 的某個函數。
這種使用大寫O來體現算法時間復雜度的記法,我們稱之為大O記法。一般而言,隨着n的增大,T(n) 增長最慢的算法為最優算法,如O(1)。
推導大O階方法
1 用常數1取代運行時間中的所有加法常數。f(n) = 6 -> f(n) = 1
2 在修改后的運行次數函數中,只保留最高級階項。 f(n) = n² + n -> f(n) = n²
3 如果最高次項存在且不是1,則去除與這個項相乘的常數。f(n) => n²/2 -> f(n) = n²
常數階
不論n的大小,運行次數恆定的算法,我們稱之為具有O(1)的時間復雜度,又為常數階。如hash算法,即為f(n) = 1。
線性階
運行次數與n的大小呈線性關系,我們稱之為具有O(n) 的時間復雜度,又稱線性階。如遍歷一個集合,即為f(n) = n。
對數階
運行次數與n 的大小呈對數關系,我們稱之為具有O(logn)的時間復雜度,又稱對數階。
如下程序,f(n) = log2n, 時間復雜度為O(n) = logn。
int count =1;
while(count < n) {
count = count *2;
}
平方階
運行次數與n 的大小呈平方階關系,我們稱之為O(n2)的時間復雜度,又稱平方階。如等比數列。
常見的時間復雜度
執行函數 | 階 |
---|---|
19 | O(1) |
n + 1 | O(n) |
n² + 1 | O(n2) |
3log2n + 2 | O(logn) |
n + nlog2n | O(nlogn) |
n³ + n | O(n³) |
時間復雜度大小依此為:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n³)