對一個算法而言,評估一個算法的優劣除了能否正確的完成制定任務外就要看一個算法的空間複雜度和時間複雜度,一般情況下,我們認爲的是看最壞情況下的空間複雜度和最差時間複雜度。需要注意的是,空間複雜度和時間複雜度往往不可得兼,解決同一個任務一個時間複雜度低的算法往往會空間複雜度較高,犧牲空間來換取時間,隨着計算機的發展,一般情況下認爲時間複雜度低的算法更優秀。
1.時間複雜度
時間複雜度常用大O符號表示,取有關輸入的數的最高項如下
int n;
scanf("%d",&num);
int num = 0;
for(;num<n;num++)
printf("%d",num);
printf函數運行次數與n有關則其時間複雜度爲O(n).
要注意的是時間複雜度只與輸入的值的最高項有關係,如下爲二分搜索的代碼
i=0;
while(i<n){i++};//這條語句執行了N次
i=0;
j=0;
while(i<n)
{ while(j<n)
{
j++;//這條語句執行了n^2次
}i++;j=0;
}
其代碼運行爲n+n^2,但是複雜度爲O(n^2).
一個代碼如果沒有輸入項其運行代碼條數固定,則無論多長都是O(1).
利用遞歸寫法的斐波那契數列
int Fib(int N)
{
if (N < 3) //當N<3時,斐波那契數爲1
return 1;
return Fib(N - 1) + Fib(N - 2);//函數遞歸
}
int main()
{
int n = 0;
scanf("%d",&n);
printf("%d",Fib(n));
return 0;
}
算法可表示爲
當輸入爲5的時候,可以看出深度爲5,其中運算9次及2^3+1次運算,算法複雜度爲O(2^n);
常見的時間複雜度順序爲
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
2.空間複雜度
空間複雜度(Space Complexity)是對一個算法在運行過程中臨時佔用存儲空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序的空間複雜度是O(n^2),空間複雜度是O(1) 。而一般的遞歸算法就要有O(n)的空間複雜度了,因爲每次遞歸都要存儲返回信息。一個算法的優劣主要從算法的執行時間和所需要佔用的存儲空間兩個方面。