1. 程式人生 > >資料結構和演算法分析學習筆記——複雜度分析

資料結構和演算法分析學習筆記——複雜度分析

複雜度分析

本文只是我的個人學習筆記,用於記錄資料結構和演算法的學習總結。

如何得到演算法的執行效率?

  1. 事後統計 方式:直接在裝置上執行得到結果 缺點:測試結果受測試環境和測試資料規模影響

  2. 複雜度分析 方式:時間複雜度分析和空間複雜度分析,直接通過程式碼就可以粗略的計算出演算法的執行效率。通過 大 O 來表示

時間複雜度

時間複雜度:全名是漸進時間複雜度,標識程式碼執行時間隨資料規模增長變化的趨勢。通常我們會忽略掉公式中的常量、低階、係數,只記錄最大的量級。例如:T(n) = O(2n+2) 和 T(n) = O( 2n^2 +2n+3 )就可以記為:T(n) = O(n) 和 T(n) = O( n^2 )。

如何計算

我們在分析一個演算法、一段程式碼的時間複雜度的時候,只關注迴圈次數最多那一段程式碼。這段核心程式碼執行次數的n的量級,就是整段要分析程式碼的時間複雜度。

需要遵循以下幾點:

  • 加法法則:總的時間複雜度就等於量級最大的那段程式碼的時間複雜度

  • 乘法法則:巢狀程式碼的複雜度等於巢狀內外程式碼複雜度的乘積

常見的時間複雜度量級

  • 多項式量級:O(1)、O(n)、O(logn)、O(nlogn)、O(n^k )

  • 非多項式量級:O( 2^n )和O(n!)

空間複雜度

空間複雜度:漸進空間複雜度,表示演算法的儲存空間與資料規模之間的增長關係。常見的空間複雜度就是 O(1)、O(n)、O(n^2 )。

最好、最壞、平均、均攤時間複雜度

最好時間複雜度和最壞時間複雜度

最好時間複雜度:在最理想的情況下,執行這段程式碼的時間複雜度。 最壞時間複雜度:在最壞的情況下,執行這段程式碼的時間複雜度。

例如:查詢一個無序陣列中的元素x,如果該陣列的第一個元素就是x,那麼就是最好的時間複雜度。如果最後一個元素是元素x,那麼就是最壞時間複雜度。

平均時間複雜度

平均時間複雜度:全稱加權平均時間複雜度或者期望時間複雜度。它的值是程式碼在所有情況下執行的次數的加權平均值。

均攤時間複雜度

均攤時間複雜度: 一種特殊的平均時間複雜度,一般滿足下面兩個條件使用:

  • 程式碼在絕大多數情況下是低級別複雜度,只有極少數情況是高級別複雜度。
  • 低級別和高級別複雜度出現具有時序規律。均攤結果一般都等於低級別複雜度。

小結

複雜度也就是漸進時間複雜度,越高階複雜度的演算法,執行效率越低。常見的複雜度從低階到高階有:O(1)、O(logn)、O(n)、O(nlogn)、O(n^2 )。