乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。
文章最後,舉例使用二分查詢和斐波那契的遞迴和迭代方法,分別說明時間和空間複雜度。
首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。 當我們面前有多個演算法時,我們可以通過計算時間複雜度,判斷出哪乙個演算法在具體執行時花費時間最多和最少。
常見的時間複雜度有:
常數階o(1),
對數階o(log2 n),
線性階o(n),
線性對數階o(n log2 n),
平方階o(n^2),
立方階o(n^3)
k次方階o(n^k),
指數階o(2^n)。
隨著n的不斷增大,時間複雜度不斷增大,演算法花費時間越多。
計算方法 :
①選取相對增長最高的項
②最高項係數是都化為1
③若是常數的話用o(1)表示
如f(n)=2*n^ 3+2n+100 則o(n)=n^3。
通常我們計算時間複雜度都是計算最壞情況 時間複雜度的計算:
(1)如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。
int x=1;
while
(x <10)
該演算法執行次數是10,是乙個常數,用時間複雜度表示是o(1)。
(2)當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。
for
(i =
0; i < n; i++
)}
該演算法for迴圈,最外層迴圈每執行一次,內層迴圈都要執行n次,執行次數是根據n所決定的,時間複雜度是o(n^2)。
(3)迴圈不僅與n有關,還與執行迴圈所滿足的判斷條件有關.
int i=0;
while
(i < n && arr[i]!=1
)
在此迴圈,如果arr[i]不等於1的話,時間複雜度是o(n)。如果arr[i]等於1的話,則迴圈不能執行,時間複雜度是0。
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。
計算方法:
①忽略常數,用o(1)表示
②遞迴演算法的空間複雜度=遞迴深度n*每次遞迴所要的輔助空間
③對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。
如:
int a;
int b;
int c;
printf
("%d %d %d \n"
,a,b,c)
;
它的空間複雜度o(n)=o(1);
int
fun(
int n,
)
遞迴實現,呼叫fun函式,每次都建立1個變數k。呼叫n次,空間複雜度o(n*1)=o(n)。
1:實現二分查詢演算法的遞迴及非遞迴。(分析時間複雜度及空間複雜度)
迭代演算法
#define _crt_secure_no_warnings
#include
#include
#include
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);
遞迴演算法
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)
2:實現斐波那契數列的遞迴及非遞迴。(分析時間複雜度及空間複雜度)
迭代演算法
int
feibonacciinteration
(int a,
int b,
int num)
return c;}}
intmain()
else
return0;
}
時間複雜度o(n)
空間複雜度為o(1)
遞迴演算法
int
feibonaccirecursion
(int num)
intmain()
時間複雜度為o(2^n)
空間複雜度為o(n)
時間複雜度和空間複雜度計算
時間複雜度 首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。當我們面前有多個演算法時,我們可以通過計算時間複雜度,判斷出哪乙個演算法在具體執行時花費時間最多和最少。常見的時間複雜度有 常數階o 1 對數階o log2 n 線性階o n 線性對數階o n log2...
時間複雜度和空間複雜度的計算
時間複雜度 1.一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t n o f n 分析 隨著模組n的增大,演算法執行的時間的增長率和 f n 的增長率成正比,所以 f n 越小,演算法的時間複雜度越低,演算法的效率越高。2.在計算時間複雜度的時候...
時間複雜度和空間複雜度的計算
時間複雜度 執行乙個演算法,執行的次數和問題規模之間的函式關係,用o 表示。o 1 常數項,和問題的規模無關。時間複雜度計算規則 1.只保留最高端項 2.不要係數 空間複雜度 執行乙個演算法,需要額外的輔助空間和問題規模之間的函式關係,用o 表示。簡單來說,時間複雜度指的是執行次數,空間複雜度指的是...