資料結構之演算法時間複雜度
演算法的時間複雜度定義為:
在進行演算法分析時,語句總的執行次數t(n)是關於問題規模n的函式,進而分析t(n)隨n的變化情況並確定t(n)的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作:t(n}=0(f(n))。它表示隨問題規模n的增大,演算法執行時間的埔長率和 f(n)的埔長率相同,稱作演算法的漸近時間複雜度,簡稱為時間複雜度。其中f( n)是問題規橫n的某個函式。
根據定義,求解演算法的時間複雜度的具體步驟是:
1.用常數1取代執行時間中的所有加法常數。
2.在修改後的執行次數函式中,只保留最髙階項。
3.如果最高端項存在且不是1,則去除與這個項相乘的常數。
簡單的說,就是保留求出次數的最高次冪,並且把係數去掉。 如t(n)=2n^2+n+1 =o(n^2)
例如:
#include "stdio.h"
int main()
}printf("%d", sum); /* 執行1次 */
}
按照上面推導「大o階」的步驟,我們來看第一步:「用常數 1 取代執行時間中的所有加法常數」,
則上面的算式變為:執行總次數 =3n^2 + 3n + 1
(直接相加的話,應該是t(n) = 1 + n+1 + n + n*(n+1) + n*n + n*n + 1 = 3n^2 + 3n + 3。現在用常數 1 取代執行時間中的所有加法常數,就是把t(n) = 3n^2 + 3n + 3中的最後乙個3改為1. 就得到了 t(n) = 3n^2 + 3n + 1)
第二步:「在修改後的執行次數函式中,只保留最高端項」。
這裡的最高端是 n 的二次方,所以算式變為:執行總次數 = 3n^2
第三步:「如果最高端項存在且不是 1 ,則去除與這個項相乘的常數」。
這裡 n 的二次方不是 1 所以要去除這個項的相乘常數,算式變為:執行總次數 = n^2
因此最後我們得到上面那段**的演算法時間複雜度表示為: o( n^2 )
下面我把常見的演算法時間複雜度以及他們在效率上的高低順序記錄在這裡,使大家對演算法的效率有個直觀的認識。
o(1) 常數階 < o(logn) 對數階 < o(n) 線性階 < o(nlogn)
< o(n^2) 平方階 < o(n^3)
<
最後三項用大括號把他們括起來是想要告訴大家,如果日後大家設計的演算法推導出的「大o階」是大括號中的這幾位,那麼趁早放棄這個演算法,在去研究新的演算法出來吧。因為大括號中的這幾位即便是在 n 的規模比較小的情況下仍然要耗費大量的時間,演算法的時間複雜度大的離譜,基本上就是「不可用狀態」。
一 計算 1 + 2 + 3 + 4 + …… + 100。
常規演算法,**如下:
#include "stdio.h"
int main()
printf("%d", sum); /* 執行1次 */
}
**附加的注釋可以看到所有**都執行了多少次。那麼這寫**語句執行次數的總和就可以理解為是該演算法計算出結果所需要的時間。該演算法所用的時間(演算法語句執行的總次數)為: 1 + ( n + 1 ) + n + 1 = 2n + 3
而當 n 不斷增大,比如我們這次所要計算的不是 1 + 2 + 3 + 4 + …… + 100 = ? 而是 1 + 2 + 3 + 4 + …… + n = ?其中 n 是乙個十分大的數字,那麼由此可見,上述演算法的執行總次數(所需時間)會隨著 n 的增大而增加,但是在 for 迴圈以外的語句並不受 n 的規模影響(永遠都只執行一次)。所以我們可以將上述演算法的執行總次數簡單的記做: 2n 或者簡記 n
這樣我們就得到了我們設計的演算法的時間複雜度,我們把它記作: o(n)
二 求兩個n階方陣c=a*b的乘積其演算法如下:
void matrixmultiply(int a[n][n],int b [n][n],int c[n][n])}}
}
則該演算法所有語句的頻度之和為:
t(n) = 2n^3+3n^2+2n+1; 利用大o表示法,該演算法的時間複雜度為o(n^3)。
三 分析下列時間複雜度
void test_(int n)
}
設for迴圈語句執行次數為t(n),則 i = 2t(n) + 1 <= n - 1, 即t(n) <= n/2 - 1 = o(n)
四 分析下列時間複雜度
void test_2(int b, int n)
}x = b[i];
b[i] = b[k];
b[k] = x;}}
其中,演算法的基本運算語句是
if (b[k] > b[j])
其執行次數t(n)為:
五 分析下列時間複雜度
void test_3(int n)
else
}
對於遞迴函式的分析,跟設計遞迴函式一樣,要先考慮基情況(比如hanoi中n==1時候),這樣把乙個大問題劃分為多個子問題的求解。
故此上述演算法的時間複雜度的遞迴關係如下:
常用排序演算法時間複雜度
資料結構之演算法時間複雜度
演算法的時間複雜度定義為 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n 0 f n 它表示隨問題規模n的增大,演算法執行時間的埔長率和 f n 的埔長率相同,稱作演算...
資料結構之演算法時間複雜度
演算法的時間複雜度定義為 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n 0 f n 它表示隨問題規模n的增大,演算法執行時間的埔長率和 f n 的埔長率相同,稱作演算...
資料結構之演算法時間複雜度
演算法的時間複雜度定義為 在進行演算法分析時,語句總的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n 0 f n 它表示隨問題規模n的增大,演算法執行時間的埔長率和 f n 的埔長率相同,稱作演算...