算法的時間複雜度,也就是算法的時間量度,記做:T(n)=O(f(n))。它表示隨問題規模n的增大,算法執行時間的增加率和f(n)的增加率相同,稱做算法的漸近時間複雜度,簡稱爲時間複雜度。其中f(n)是問題規模n的某個函數。php
通常狀況下,隨着n的增大,T(n)增加最慢的算法爲最優算法。算法
O(1)叫常數階、O(n)叫線性階、O(n^2)叫平方階。函數
推導大O階:學習
1.用常數1取代運行時間中的全部加法常數。code
2.在修改後的運行次數函數中,只保留最高階項。io
3.若是最高階項存在且不是1,則去除與這個項相乘的常數。function
int sum = 0,n = 100; /* 執行一次 */ sum = (1 + n) * n / 2; /* 執行一次 */ printf("%d", sum); /* 執行一次 */
運行次數函數是f(n)=3,時間複雜度爲O(1)。與問題的大小無關(n的多少),執行時間恆定的算法,叫常數階。互聯網
int i; for (i = 0; i < n; i++) { /* 時間複雜度爲O(1)的程序步驟序列 */ }
時間複雜度爲O(n),由於循環體中的代碼需要執行n次。循環
int count = 1; while (count < n) { count = count * 2; /* 時間複雜度爲O(1)的程序步驟序列 */ }
由2x=n獲得x=log2n,時間複雜度爲O(logn)。二維碼
int i, j; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { /* 時間複雜度爲O(1)的程序步驟序列 */ } }
外層的循環時間複雜度O(n),內層時間複雜度爲O(n),因此這段代碼的時間複雜度爲O(n^2)。
n++; /* 執行次數爲1 */ function(n); /* 執行次數爲n */ int i, j; for (i = 0; i < n; i++) /* 執行次數爲n^2 */ { function (i); } for (i = 0; i < n; i++) /* 執行次數爲n(n + 1)/2 */ { for (j = i; j < n; j++) { /* 時間複雜度爲O(1)的程序步驟序列 */ } }
執行次數f(n)=1+n+n^2+n(n+1)/2=3/2·n^2+3/2·n+1,時間複雜度也是O(n2)。
互聯網工程師(id:phpstcn),咱們一塊兒學習,一塊兒進步