定義:一個算法中的語句執行次數稱爲 語句頻度 或 時間頻度;算法
約定:檢驗算法的效率,主要考慮 最壞時間複雜度 和 平均時間複雜度 通常不特別說明,討論的時間複雜度均是最壞狀況下的時間複雜度函數
一、時間複雜度post
一個算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但咱們不可能也沒有必要對每一個算法都上機測試,只需知道哪一個算法花費的時間多,哪一個算法花費的時間少就能夠了。而且一個算法花費的時間與算法中語句的執行次數成正比例,哪一個算法中語句執行次數多,它花費時間就多。測試
在時間頻度中,n稱爲問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。可是它的變化是有規律的,因此引入時間複雜度這個概念。通常狀況下,算法中的基本操做重複次數的是問題規模n的某個函數,用T(n)表示,如有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值爲不等於零的常數,則稱f(n)是T(n)的同數量級函數。記做T(n)=O(f(n)),稱O(f(n)) 爲算法的漸進時間複雜度,簡稱時間複雜度。code
計算時間複雜度blog
(1) 若是算法的執行時間不隨着問題的規模n的增加而增加,即便算法中有上千條語句,執行時間也只是一個比較大的常數。此類算法的時間複雜度爲O(1);遞歸
按數量級遞增排列,常見的時間複雜度有:常數階O(1),對數階O(log2n),線性階O(n), 線性對數階O(nlog2n),平方階O(n2),立方階O(n3),..., k次方階O(nk),指數階O(2n)。隨着問題規模n的不斷增大,上述時間複雜度不斷增大,算法的執行效率越低。內存
1 i = 100000; 2 while(i--) { 3 printf("hello"); 4 }
解答:it
這個算法循環100000次,雖然它運行次數很是多,可是主要執行的第三行的執行時間是常數值,因此他的時間複雜度爲常數階O(1);class
(2) 當有多個循環嵌套時,算法的時間複雜度是由嵌套層數最多的循環語句的語句頻度決定的
1 x=0; 2 for(i=1;i<=n;i++) 3 for(j=1;j<=i;j++) 4 for(k=1;k<=j;k++) 5 x++;
這個算法中主要執行的是第5行,它的執行時間是常數值,可是它上面有三層循環,每層每次分別執行是(從最外層到內) [(n-1) ],[(n-1)+(n-2) ....],[(n-1-1)+(n-2-1) ....] 次,因此該算法的時間複雜度爲O(n3+ 剩餘低次項) ≈O(n3);
PS: 簡單的計算方式(只能參考): 一個循環爲n,一個嵌套是n+1,並列時是+n,最後結果取最大項;
二、空間複雜度
一個程序的空間複雜度是指運行完一個程序所需內存的大小。