是什麼?
指執行某個演算法所需要的記憶體空間
由於現在科技的發展我們完全可以用空間去換取時間
例:要判斷某年是不是閏年?
花點心思來寫乙個演算法,每給乙個年份,就可以通過這個演算法計算得到是否是閏年的結果。
事先建立乙個有2050個元素的陣列,然後把所有的年份按下錶的數字對應,如果是閏年,則此陣列元素的值是1,如果不是元素的值則為0。這樣,所謂的判斷某一年是否為閏年就變成了查詢這個陣列某乙個元素的值的問題。
注:第一種方法相比起第二種來說很明顯非常節省空間,但每一次查詢都需要經過一系列的計算才能知道是否為閏年。第二種方法雖然需要在記憶體裡儲存2050個元素的陣列,但是每次查詢只需要一次索引判斷即可
通常,我們都是用「時間複雜度」來指執行時間的需求,是用「空間複雜度」指空間需求。當直接要讓我們求「複雜度」時,通常指的是時間複雜度。顯然對時間複雜度的追求更是屬於演算法的潮流!
如何計算空間複雜度?
乙個演算法的空間複雜度只考慮在執行過程中為區域性變數分配的儲存空間的大小,它包括為參數列中形參變數分配的儲存空間和為在函式體中定義的區域性變數分配的儲存空間兩個部分
若乙個演算法為遞迴演算法,其空間複雜度為遞迴所使用的堆疊空間的大小,它等於一次呼叫所分配的臨時儲存空間的大小乘以被呼叫的次數(即為遞迴呼叫的次數加1,這個1表示開始進行的一次非遞迴呼叫)。
演算法的空間複雜度一般也以數量級的形式給出。如當乙個演算法的空間複雜度
乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1)
當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為o(log2n)
當乙個演算法的空間複雜度與n成線性比例關係時,可表示為o(n)
若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間
若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數
舉個例子1:
空間複雜度分析1:
int fun(int n)
由於演算法中臨時變數的個數與問題規模n無關,所以空間複雜度均為s(n)=o(1)。
舉個例子2:
void fun(int a,int n,int k){//陣列a共有n個元素
int i;
if (k==n-1){
for (i=0;i
時間複雜度空間複雜度介紹
演算法複雜度分為 時間複雜度和空間複雜度。度量乙個演算法執行時間的方法有兩種 在給出間複雜度的概念之前先來看看什麼是時間頻度?計算1到100的和 第一種 使用for迴圈 int sum 0 int n 100for int i 1 i n i 時間頻度t n n 1注意 因為最後還要在判斷一次,所以...
時間複雜度和空間複雜度介紹
乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。時間複雜度是程式執行的時間,也可以說是次數 空間複雜度是程式占用的空間 來自 資料結構 原圖官方定義 清華出版社 時間複雜度 首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。當我們面前有多...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...