演算法(algorithm)是指用來運算元據、解決程式問題的一組方法。對於同乙個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別。
那麼我們應該如何去衡量不同演算法之間的優劣呢?
主要還是從演算法所占用的「時間」和「空間」兩個維度去考量。
因此,評價乙個演算法的效率主要是看它的時間複雜度和空間複雜度情況。然而,有的時候時間和空間卻又是「魚和熊掌」,不可兼得的,那麼我們就需要從中去取乙個平衡點。
下面我來分別介紹一下「時間複雜度」和「空間複雜度」的計算方式。
首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。
當我們面前有多個演算法時,我們可以通過計算時間複雜度,判斷出哪乙個演算法在具體執行時花費時間最多和最少。
常見的時間複雜度有:
隨著n的不斷增大,時間複雜度不斷增大,演算法花費時間越多。計算方法
①選取相對增長最高的項
②最高項係數是都化為1
③若是常數的話用o(1)表示
如f(n)=2*n^3+2n+100
則o(n)=n^3。
通常我們計算時間複雜度都是計算最壞情況
1. 常數例題的時間複雜度
int x =90;
int y =
100;
while
(y >0)
else
}
這段**裡只有常量,所以時間複雜度只有o(1)
2. for迴圈的時間複雜度
for
(i=1
; i<=n;
++i)
這段**,for迴圈裡面的**會執行n遍,因此它消耗的時間是隨著n的變化而變化的,因此這類**都可以用o(n)來表示它的時間複雜度。
巢狀迴圈的時間複雜度
for
(i =
0; i < n; i++)}
}
當有若干個迴圈時,時間複雜度是和巢狀層數最多的迴圈語句中最內層的頻度決定的,時間複雜度:o(n^3)
求二分法的時間複雜度
在最壞的情況下迴圈x次後找到,n/(2^x)=1;x=log2n;
所以二分查詢的時間複雜度為:o(log2n)
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。計算方法:
①忽略常數,用o(1)表示
②遞迴演算法的空間複雜度=遞迴深度n*每次遞迴所要的輔助空間
③對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。
1. 常數
int
fun(
int n,
)
遞迴實現,呼叫fun函式,每次都建立1個變數k。呼叫n次,空間複雜度o(n*1)=o(n)
2. 實現二分查詢演算法的遞迴及非遞迴
#define _crt_secure_no_warnings
#include
#include
#include<
assert
.h>
intbinarysearch
(int arr,
int len,
int num)
else
if(num < arr[mid]
)else
}return-1
;}intmain()
;int length =
sizeof
(arr)
/sizeof
(arr[0]
);int aim =9;
int result;
result =
binarysearch
(arr, length, aim);if
(result ==-1
)else
return0;
}
二分查詢時,每次都在原有查詢內容進行二分,所以時間複雜度為o(log2 n)
因為變數值建立一次,所以空間複雜度為o(1)
3. 遞迴演算法
int
binarysearchrecursion
(int arr[5]
,int lef,
int rig,
int aim)
else
if(arr[mid]
< aim)
else
if(aim == arr[mid])}
else
return-1
;}intmain()
;int sz =
sizeof
(arr)
/sizeof
(arr[0]
);int result;
result =
binarysearchrecursion
(arr,
0, sz -1,
4);if
(-1== result)
else
printf
("aim at %d location\n"
, result+1)
;}
時間複雜度為o(log2 n)
每進行一次遞迴都會建立變數,所以空間複雜度為o(log2 n)
時間複雜度和空間複雜度詳解
本文 演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間...
時間複雜度和空間複雜度詳解
演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算...
時間複雜度和空間複雜度詳解
演算法的時間複雜度和空間複雜度合稱為演算法的複雜度。1.時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算...