空間複雜度
演演算法臨時佔用存儲空間的量度
空間複雜度(Space Complexity)是對一個演演算法在運行過程中臨時佔用存儲空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序的時間複雜度是O(n^2),空間複雜度是O(1)。而一般的遞歸演演算法就要有O(n)的空間複雜度了,因為每次遞歸都要存儲返回信息。一個演演算法的優劣主要從演演算法的執行時間和所需要佔用的存儲空間兩個方面衡量。
類似於時間複雜度的討論,一個演演算法的空間複雜度(Space Complexity)S(n)定義為該演演算法所耗費的存儲空間,它也是問題規模n的函數。漸近空間複雜度也常常簡稱為空間複雜度。空間複雜度(SpaceComplexity)是對一個演演算法在運行過程中臨時佔用存儲空間大小的量度。一個演演算法在計算機存儲器上所佔用的存儲空間,包括存儲演演算法本身所佔用的存儲空間,演演算法的輸入輸出數據所佔用的存儲空間和演演算法在運行過程中臨時佔用的存儲空間這三個方面。演演算法的輸入輸出數據所佔用的存儲空間是由要解決的問題決定的,是通過參數表由調用函數傳遞而來的,它不隨本演演算法的不同而改變。存儲演演算法本身所佔用的存儲空間與演演算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的演演算法。演演算法在運行過程中臨時佔用的存儲空間隨演演算法的不同而異,有的演演算法只需要佔用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演演算法是“就地\"進行的,是節省存儲的演演算法,如這一節介紹過的幾個演演算法都是如此;有的演演算法需要佔用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將佔用較多的存儲單元,例如將在第九章介紹的快速排序和歸併排序演演算法就屬於這種情況。
分析一個演演算法所佔用的存儲空間要從各方面綜合考慮。如對於遞歸演演算法來說,一般都比較簡短,演演算法本身所佔用的存儲空間較少,但運行時需要一個附加堆棧,從而佔用較多的臨時工作單元;若寫成非遞歸演演算法,一般可能比較長,演演算法本身佔用的存儲空間較多,但運行時將可能需要較少的存儲單元。
一個演演算法的空間複雜度只考慮在運行過程中為局部變數分配的存儲空間的大小,它包括為參數表中形參變數分配的存儲空間和為在函數體中定義的局部變數分配的存儲空間兩個部分。若一個演演算法為遞歸演演算法,其空間複雜度為遞歸所使用的堆棧空間的大小,它等於一次調用所分配的臨時存儲空間的大小乘以被調用的次數(即為遞歸調用的次數加1,這個1表示開始進行的一次非遞歸調用)。演演算法的空間複雜度一般也以數量級的形式給出。如當一個演演算法的空間複雜度為一個常量,即不隨被處理數據量n的大小而改變時,可表示為O(1);當一個演演算法的空間複雜度與以2為底的n的對數成正比時,可表示為O(log2n);當一個演演算法的空間複雜度與n成線性比例關係時,可表示為O(n).若形參為數組,則只需要為它分配一個存儲由實參傳送來的一個地址指針的空間,即一個機器字長空間;若形參為引用方式,則也只需要為其分配存儲一個地址的空間,用它來存儲對應實參變數的地址,以便由系統自動引用實參變數。
對於一個演演算法,其時間複雜度和空間複雜度往往是相互影響的。當追求一個較好的時間複雜度時,可能會使 空間複雜度的性能變差,即可能導致佔用較多的 存儲空間;反之,當追求一個較好的空間複雜度時,可能會使 時間複雜度的性能變差,即可能導致佔用較長的運行時間。另外,演演算法的所有性能之間都存在著或多或少的相互影響。因此,當設計一個演演算法(特別是大型演演算法)時,要綜合考慮演演算法的各項性能,演演算法的使用頻率,演演算法處理的數據量的大小,演演算法描述語言的特性,演演算法運行的機器系統環境等各方面因素,才能夠設計出比較好的演演算法。演演算法的時間複雜度和 空間複雜度合稱為演演算法的複雜度。