時間複雜度與空間複雜度

2021-08-17 07:31:33 字數 2035 閱讀 2574

本文部分取自搜狗百科

在求演算法效率時,通常有事前分析和事後分析兩種方法,事後分析因為必須實際檢驗過後才能得出答案,且可能由於硬體方面等外部原因影響結果而不被推廣,事前分析的主要就是在考量乙個演算法的基本執行次數,這就是時間複雜度。

##時間複雜度:

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t(n)表示,若有某個輔助函式f(n),記作t(n)=o(f(n)),稱o(f(n))為演算法的漸進時間複雜度(o是數量級的符號 ),簡稱時間複雜度。

乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。

計算時間複雜度的基本規則 :     

1 ,計算出基本操作的執行次數 t(n)(考慮最壞情況)

2,計算t(n)的數量級(去除常數項,低次冪和最高次冪的係數)

3,用大o表示時間複雜度。

tips:

1、取決於執行次數最多的語句,如當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。

2、如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。

3、演算法的時間複雜度不僅僅依賴於問題的規模,還與輸入例項的初始狀態有關。

4,遞迴演算法的時間複雜度 = 遞迴的次數 * 每次遞迴基本操作的執行次數

空間複雜度

空間複雜度(spacecomplexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。乙個演算法在計算機 儲存器上所占用的 儲存空間,包括儲存演算法本身所占用的儲存空間,演算法的輸入輸出資料所占用的儲存空間和演算法在執行過程中臨時占用的儲存空間這三個方面。

時間複雜度與空間複雜度往往不能「雙贏」,意思就是時間複雜度小的演算法一般會占用較多的空間,而空間複雜度小的演算法一般執行時間也較長,這也是「用空間換時間」等說法的由來。

遞迴演算法的空間複雜度 = 遞迴深度 * 每次遞迴需要開闢的空間。

int binarysearch(int *p, int x,int size)//二分查詢非遞迴

else if (x < p[mid])

else

}printf("search was failed");

return -1;

}

int binarysearch(int p, int low, int high, int x)//二分查詢遞迴

else if (x > p[mid])

else

}else

}

以上兩段**分別是二分查詢的非遞迴演算法和遞迴演算法。現在來分析一下他們的時間複雜度和空間複雜度。

非遞迴演算法中,每次都會捨棄一半的資料,最壞情況就是n/(2^x)=1;則 x=log n,o(log n)就是他的時間複雜度,而空間複雜度上因為每次只開闢有限個空間,所以空間複雜度是o(1).

在遞迴演算法中,時間複雜度=遞迴的次數 * 每次遞迴基本操作的執行次數,遞迴次數為log n,每次執行次數為1,故時間複雜度為o(log n)。空間複雜度=遞迴深度 * 每次遞迴開闢的空間。

遞迴深度為log n,每次開闢為4個,故空間複雜度=o(log n)。

再比如求斐波那契數列的第n項,

遞迴演算法:

int fib1(int n)

非遞迴演算法:

int fib(int n)

int first = 1;

int second = 1;

int ret = 0;

for (int i = 2; i < n; i++)

return ret;

}

遞迴演算法中時間複雜度 是o(2^n),空間複雜度是o(n)。

非遞迴演算法中時間複雜度是o(n),空間複雜度是o(1)。(迴圈為n-1次)

時間複雜度與空間複雜度

空間複雜度 space complexity 是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s n o f n 比如直接 插入排序 的時間複雜度 是o n 2 空間複雜度是o 1 而一般的 遞迴演算法就要有o n 的空間複雜度了,因為每次遞迴都要儲存返回資訊。乙個演算法的優劣主要從演算法...

時間複雜度與空間複雜度

本文是對時間複雜度以及空間複雜度的乙個理解 時間複雜度 由於環境的不同,同樣的 執行所需要的時間是不同的,所以是不能拿來比較的 而函式中執行的次數確實一樣的 所以時間複雜度就是 程式每個迴圈中的語句總共會執行的次數 時間複雜度的表示方法 大o漸進表示法 o f n 這裡的f n 是什麼呢?void ...

時間複雜度與空間複雜度

一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式f n 演算法的時間度量記 t n o f n 它表示問題規模隨n的增大,演算法執行時間的增長率和f n 的增長率相同,稱做演算法的漸近時間複雜度,簡稱時間複雜度。例如 void test0 int n 總執行次數f n 10 時間複雜...