一般我們從時間複雜度和空間複雜度兩個方面對演算法的效率進行分析。
一.時間複雜度(time complexity)
我們通常將時間複雜度記為:
t
(n)=o(
f(n)
)
我們將此式分為三個部分進行講述。
t(n)
:演算法的漸近時間複雜度,簡稱時間複雜度。
f(n)
:演算法中語句中執行次數最多的語句的頻度。
o()
:計算數量級。
數學表示式為:
存在正常數c和n0,當n>=n0時,0<=t(n)<=c*f(n)
1.三種時間複雜度
最壞時間複雜度:最壞情況下的時間複雜度。
平均時間複雜度:所有輸入例項等概率出現情況。
最好時間複雜度:最好情況下時間複雜度。
我們利用乙個例子說明:
在氣泡排序中,如果序列本有序,我們只需比較 n-1 次,排序完成,則為最好情況下時間複雜度為 o(n)。如果序列為逆序,則需要比較(n-1)+(n-2)+....+1=n*(n-1)/2
,此時時間複雜度為 o(n²)。則平均複雜的也為o(n²)。
2.常見的時間複雜度(從小到大排列)
常數階:o(1)
對數階:o(log2n)
void
fun(
int n)
線性階:o(n)
for
(int i=
0;i++
;i
count=0;
for(k=
1;k<=n;k*=2)
for(j=
1;j<=n;j++
) count++
;
平方階:o(n²)
for
(int i=
0;i)
立方階:o(n³)
for
(int i=
0;i)}
指數階:o(2n)
//fibonacci數列的遞迴演算法
intf
(int n)
return
f(n-1)
+f(n-2);
}
階乘:o(n!)
k次方階:o(nk)
3.時間複雜度的計算
迴圈條件中變數參與迴圈條件
int i=1;
while
(i<=n)
對於此種程式,我們設迴圈次數為t,則可根據迴圈條件得到:
2^t<=n
於是可以推出t<=log2n
,得到t(n)=log2n
迴圈主體中變數與迴圈條件無關
ⅰ.遞迴程式:利用公式進行遞推。
ⅱ.非遞迴程式
我們通常將空間複雜度記為:
s
(n)=o(
f(n)
)
我們將此式分為三個部分進行講述。
s(n):空間複雜度。
f(n):輔助儲存空間。
輔助儲存空間:
一般情況下, 乙個程式在機器上執行時, 除了需要儲存本身所需要的**/輸入資料外, 還需要一些對資料進行操作的輔助儲存空間.其中輸入資料所占用的具體空間取決於問題本身, 與演算法無關. 因此我們所討論的空間複雜度只與該演算法在實現時所需要的輔助空間單元個數相關
o():數量級。
1.常見空間複雜度
常數階 o(1):氣泡排序,直接插入排序,簡單選擇排序,希爾排序,堆排序。
線性階 o(n):二路歸併排序。
對數階 o(log2n):快速排序。
演算法效能分析
重新學習乙個 對於乙個程式 效能來說 的評估,主要從時間和空間來進行考慮的。時間是指程式執行的時間,稱為時間複雜度,空間方面則是指程式在計算機記憶體所占用的時間大小,稱為空間複雜度。一些小技巧 少用 多層迴圈巢狀,據一同學透析他接盤的一老專案,發現了乙個套了至少五六層迴圈,且每層迴圈中 包含了 數量...
排序演算法效能分析
一 基於比較的排序演算法 1.插入排序法 直接插入排序,希爾排序,不常用的 tree sort library sort patience sorting 2.交換排序 氣泡排序,快速排序,計數排序 3.選擇排序 直接選擇排序,堆排序 4.歸併排序 歸併排序 二 不基於比較的排序演算法 基數排序,桶...
演算法和效能分析
資料結構與演算法是程式設計實踐中最基本的內涵。程式能否快速而有效地完成預定的任務,取決於是否選對資料結構,而程式是否能清楚而正確地把問題解決,則取決於演算法。演算法 algorithm 是指令的集合,是為了解決特定問題而規定的一系列操作。它是明確定義的可計算過程,以乙個資料集合作為輸入,並產生乙個資...