1. 程式人生 > >關於時間複雜度與空間複雜度總結

關於時間複雜度與空間複雜度總結

簡單來說,時間複雜度指的是語句執行次數,空間複雜度指的是演算法所佔的儲存空間。

 

一般情況下,隨著n的增大,T(n)增長最慢的演算法為最優演算法。

1.對於簡單的輸入輸出語句或賦值語句(無迴圈語句),近似認為需要 O(1)。一般來說,只要演算法中不存在迴圈語句,其時間複雜度就是 O(1)。

2.對於順序結構,需要依次執行一系列語句所用時間可採用 "求和法則"。

3.對於判斷條件語句來說,一般是求它的最差時間複雜度。

4.對於迴圈語句來說,只考慮迴圈體中語句的執行次數。當有若干個迴圈語句,則複雜度由最深層的迴圈內的基本語句的頻度f(n)決定的。

5.對數時間複雜度:當每次操作都能將所需要檢測的元素減少一半時(即每次操作,未檢測元素減少一半),這樣的時間複雜度為 O(logn)。

6.如果一個演算法的執行次數是 T(n),那麼只保留最高次項,同時忽略最高項的係數後得到函式 f(n),此時演算法的時間複雜度就是 O(f(n))。為了方便描述,下文稱此為 大O推導法。推導方法:1代替常數;只保留最高階;最高階不是1時去掉最高階的係數。

7.時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到 函式呼叫,要深入函式進行分析。

8.O(1) 常數階 < O(logn) 對數階 < O(n) 線性階 < O(nlogn) < O(n^2) 平方階 < O(n^3) < { O(2^n) < O(n!) < O(n^n) }
最後三項用大括號把他們括起來是想要告訴大家,如果日後大家設計的演算法推匯出的“大O階”是大括號中的這幾位,那麼趁早放棄這個演算法,在去研究新的演算法出來吧。因為大括號中的這幾位即便是在 n 的規模比較小的情況下仍然要耗費大量的時間,演算法的時間複雜度大的離譜,基本上就是“不可用狀態”。

9.空間複雜度為1時,表示這個變數與問題規模n大小無關。