算法複雜度分析

算法複雜度分析

終於放寒假了,鬆下一口氣的博主能夠專心地更新博客了,但願寒假能有更大的進步!
本系列在於記載個人算法學習筆錄,強化學習,廢話很少說,開始吧。html


什麼是複雜度分析?

  1. 數據結構和算法解決的是「如何讓計算機更快時間,更省空間的解決問題」。
  2. 所以須要從執行時間和佔用空間兩個維度來評估數據結構和算法的性能。
  3. 分別用時間複雜度和空間複雜度兩個概念來描述性能問題,兩者統稱爲複雜度。
  4. 複雜度描述的是算法執行時間(或佔用空間)與數據規模的增加關係。故稱其爲漸進時間(空間)複雜度

爲何要進行復雜度分析?

  1. 和性能測試相比,複雜度分析有不依賴環境、成本低、效率高、易操做、指導性強的特色。
  2. 掌握複雜度分析將能編寫出性能更優秀的代碼,有利於下降系統開發和維護成本

如何進行復雜度分析?

大O表示法

  1. 來源c++

    算法的執行時間與代碼的執行次數成正比,用 T(n) = O(f(n)) 表示,其中T(n)表示算法執行總時間,f(n)表示每行代碼執行總次數,而n每每表示數據的規模。算法

  2. 特色數組

    以時間複雜度爲例,因爲時間複雜度描述的是算法執行時間與數據規模的增加變化趨勢,因此常量階、低階以及係數實際上對這種增加趨勢不產生決定性影響。因此在作時間複雜度分析時忽略這些項。數據結構

複雜度分析法則

  1. 單段代碼看高頻:好比循環
  2. 多段代碼取最大: 好比一段代碼中有單循環和多重循環,那麼取多重循環
  3. 嵌套代碼求乘積:好比遞歸、多重循環等
  4. 多個規模求加法: 好比有兩個參數控制兩個循環的次數,那麼就取兩者複雜度相加 O(m+n)

經常使用的複雜度級別

複雜度量級:數據結構和算法

經常使用複雜度量級
經常使用複雜度量級

  • 多項式階:隨着數據規模的增大,算法的執行時間和空間佔用,按照多項式的比例增加。包括:ide

    O(1) 、O(logn)、O(n) 、O(nlogn) 、O(n^2)... O(n^k).性能

  • 非多項式階:隨着數據規模的增大,算法的執行時間和空間佔用暴增(NP問題),這類算法性能極差。學習

    O(2^n) 、O(n!)測試

複雜度曲線
複雜度曲線

複雜度分析

首先咱們要引入幾個概念:最好狀況時間複雜度(best case time complexity)、最壞狀況時間時間按複雜度(worst case time complexity)、平均狀況時間複雜度 (average case time complexity)、均攤時間複雜度(amortized time complexity)。

爲何要引入這4個概念?

  1. 同一段代碼在不一樣狀況下時間複雜度會出現量級差別,爲了更全面,更準確的描述代碼的時間複雜度,因此引入這4個概念。
  2. 代碼複雜度在不一樣狀況下出現量級差異時才須要區別這四種複雜度。大多數狀況下,是不須要區別分析它們的。

例子:

// 全局變量,大小爲 10 的數組 array,長度 len,下標 i。
int array[] = new int[10]; 
int len = 10;
int i = 0;

// 往數組中添加一個元素
void add(int element) {
   if (i >= len) { // 數組空間不夠了
     // 從新申請一個 2 倍大小的數組空間
     int new_array[] = new int[len*2];
     // 把原來 array 數組中的數據依次 copy 到 new_array
     for (int j = 0; j < len; ++j) {
       new_array[j] = array[j];
     }
     // new_array 複製給 array,array 如今大小就是 2 倍 len 了
     array = new_array;
     len = 2 * len;
   }
   // 將 element 放到下標爲 i 的位置,下標 i 加一
   array[i] = element;
   ++i;
}

該算法的最好狀況時間複雜度(best case time complexity)爲O(1);

最壞狀況時間複雜度(worst case time complexity)爲O(n);

均攤時間複雜度 (amortized time complexity) 爲O(1);


以上爲本篇內容,如有不足之處,請諸位多多包涵,斧正。筆者在此謝過。

相關文章
相關標籤/搜索