定義:算法語句總的執行次數 T(n) 是關于問題規模 n 的函數,進而分析 T(n) 隨 n 的變化情況并確定 T(n) 的數量級。算法的時間復雜度,也就是算法的時間度量,記作:T(n) = O(f(n)) 它表示隨問題規模 n 的增大,算法執行時間的增長率和 f(n) 的增長率相同,稱作算法的漸進時間復雜度,簡稱為時間復雜度。其中 f(n) 是問題規模 n 的某個函數。”
這種用個大寫的 O 來代表算法的時間復雜度的記法有個專業的名字叫 “大 O 階” 記法。那么通過對上述的例子進行總結,我們給出算法的時間復雜度(大 O 階)的計算方法。
推導 “大 O 階” 的步驟:
1. 用常數 1 取代運行時間中的所有加法常數。
2. 在修改后的運行次數函數中,只保留最高階項。
3. 如果最高階項存在且不是 1 ,則去除與這個項相乘的常數。
舉例:
int n = 100000; // 執行了 1 次
for (int i = 0; i < n; i++) { // 執行了 n + 1 次
for (int j = 0; j < n; j++) { // 執行了 n*(n+1) 次
printf("i = %d, j = %d\n", i, j); // 執行了 n*n 次
}
}
for (int i = 0; i < n; i++) { // 執行了 n + 1 次
printf("i = %d", i); // 執行了 n 次
}
printf("Done"); // 執行了 1 次
執行總次數 = 1 + (n + 1) + n(n + 1) + nn + (n + 1) + 1 = 2n^2 + 3n + 3 這里 n^2 表示 n 的 2 次方。
- 執行總次數 = 2n^2 + 3n + 1 這里 n^2 表示 n 的 2 次方;
- 執行總次數 = 2n^2 + 3n + 1 這里 n^2 表示 n 的 2 次方;
- 執行總次數 = n^2 這里 n^2 表示 n 的 2 次方;
最后得到上面那段代碼的算法時間復雜度表示為: O(n^2) 這里 n^2 表示 n 的 2 次方。
各個時間復雜度效率高低:
O(1) 常數階 < O(logn) 對數階 < O(n) 線性階 < O(nlogn) < O(n^2) 平方階 < O(n^3) < { O(2^n) < O(n!) < O(n^n) }
時間復雜度這個東西,其實更準確點說應該是描述一個算法在問題規模不斷增大時對應的時間增長曲線。所以,這些增長數量級并不是一個準確的性能評價,可以理解為一個近似值,時間的增長近似于 logN、NlogN 的曲線。
對增長數量級的常見假設的總結.jpg
二維圖解.jpg