空間復雜度(Space Complexity)
算法得存儲量包括:
1.程序本身所占空間。
2.輸入數據所占空間。
3.輔助變量所占空間。
輸入數據所占空間只取決於問題本身,和算法無關,則只需分析除輸入和程序之外得輔助變量所占額外空間。
空間復雜度是對一個算法在運行過程中臨時占用得存儲空間大小的量度,一般也作為問題規模n得函數,以數量級形式給出,記作:
S(n) = O(g(n))
g(n)的計算規則和時間復雜度一致
空間復雜度分析1:
1 int fun(int n){ 2 int i,j,k,s; 3 s=0; 4 for (i=0;i<=n;i++) 5 for (j=0;j<=i;j++) 6 for (k=0;k<=j;k++) 7 s++; 8 return(s); 9 }
由於算法中臨時變量得個數與問題規模n無關,所以空間復雜度均為
S(n) = O(1)
空間復雜度分析2:
1 void fun(int a[],int n,int k) 2 //數組a共有n個元素 3 { int i; 4 if (k==n-1) 5 for (i=0;i<n;i++) 6 printf(“%d\n”,a[i]); //執行n次 7 else 8 { for (i=k;i<n;i++) 9 a[i]=a[i]+i*i; //執行n-k次 10 fun(a,n,k+1); 11 } 12 }
S(n) = O(g(1*n))
此方法屬於遞歸算法,每次調用本身都要分配空間,fun(a,n,0)的空間復雜度為O(n)。
注意:
1.空間復雜度相比時間復雜度分析要少。
2.對於遞歸算法來說,代碼一般都比較簡短,算法本身所占用的存儲空間較少,但運行時需要占用較多的臨時工作單元。
若寫成非遞歸算法,代碼一般可能比較長,算法本身占用的存儲空間較多,但運行時將可能需要較少的存儲單元。