什麼是複雜度分析?
- 資料結構和演算法解決的是如何讓計算機
更快
、更省
空間的執行。 - 因此需要從兩個方面評估資料結構和演算法的優越性。
- 分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。
- 複雜度描述的是演算法的執行時間或者佔用空間的大小與資料規模增長關係。
為什麼需要複雜度分析?
- 和效能測試相比,複雜度分析有不依賴執行環境、成本低、效率高、易操作、指導性強。
- 掌握複雜度分析,將能編寫出效能更優的程式碼,有利於降低系統開發和維護成本。
如何進入複雜度分析?
大O表示法:就是在不用執行程式碼的情況下,用“肉眼” 得出一段程式碼的執行時間。
- 來源:演算法的執行時間與每行程式碼的執行次數成正比,用 T(n) = O(f(n)) 表示,其中 T(n) 表示演算法執行總時間,f(n) 表示程式碼執行總次數,而 n 往往表示資料的規模。
- 特點:以時間複雜度為例,由於時間複雜度描述的是演算法執行時間與資料規模的增長變化趨勢,所以“常量階”、低階、係數實際上對這種趨勢不產生決定性影響,所以在做時間複雜度分析時可以忽略這些項;只需要記錄一個最大量級就可以了。
- 大O 時間複雜度並不是實際程式碼真正的執行時間,而是表示程式碼執行時間歲資料規模增長的變化趨勢;所以時間複雜度也叫
漸進時間複雜度
。
總結:所有程式碼的執行時間 T(n) 與每行程式碼的執行次數n成正比; 總結公式: T(n) = O(f(n))
時間複雜度分析
- 只關注
迴圈次數最多
的一段程式碼。 - 加法法則:總複雜度等於
量級最大
的那段程式碼的複雜度; 總結公式: T1(n)=O(f(n)),T2(n)=O(g(n));那麼 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))) - 乘法法則: 巢狀程式碼的複雜度等於巢狀內外程式碼複雜度的乘積; 總結公式: T(n)=T1(n)T2(n)=O(f(n))O(g(n))=O(f(n)*g(n))
- 多規模求加法: 比如方法有兩個引數控制兩個迴圈的次數,那麼這時就取二者複雜度相加。
複雜度量級(按數量級遞增)
-
多項式階
- 常量階 O(1)
- 對數階 O(logn)
- 線性階 O(n)
- 線性對數階 O(nlogn)
- 平方階 O(n2)、立方階 O(n3) ... k 次階 O(nk)
- 非多項式
- 指數階 O(2n)
- 階乘階 O(n!)
空間複雜度分析
空間和複雜度和時間複雜度分析方法基本類似,表示演算法的儲存空間與資料規模之間的增長關係。