《數據結構與算法之美》複雜度分析(上):如何分析、統計算法的執行效率和資源消耗 (讀後感)

什麼是複雜度分析?

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

爲何須要複雜度分析?

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

如何進入複雜度分析?

大O表示法:就是在不用運行代碼的狀況下,用「肉眼」 得出一段代碼的執行時間。

  1. 來源:算法的執行時間與每行代碼的執行次數成正比,用 T(n) = O(f(n)) 表示,其中 T(n) 表示算法執行總時間,f(n) 表示代碼執行總次數,而 n 每每表示數據的規模。
  2. 特色:以時間複雜度爲例,因爲時間複雜度描述的是算法執行時間與數據規模的增加變化趨勢,因此「常量階」、低階、係數實際上對這種趨勢不產生決定性影響,因此在作時間複雜度分析時能夠忽略這些項;只須要記錄一個最大量級就能夠了。
  3. 大O 時間複雜度並非實際代碼真正的運行時間,而是表示代碼執行時間歲數據規模增加的變化趨勢;因此時間複雜度也叫 進時間複雜度
總結:全部代碼的執行時間 T(n) 與每行代碼的執行次數n成正比; 總結公式: T(n) = O(f(n))

時間複雜度分析

  1. 只關注循環次數最多的一段代碼。
  2. 加法法則:總複雜度等於量級最大的那段代碼的複雜度; 總結公式: 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)))
  3. 乘法法則: 嵌套代碼的複雜度等於嵌套內外代碼複雜度的乘積; 總結公式: T(n)=T1(n)T2(n)=O(f(n))O(g(n))=O(f(n)*g(n))
  4. 多規模求加法: 好比方法有兩個參數控制兩個循環的次數,那麼這時就取兩者複雜度相加。

複雜度量級(按數量級遞增)

  • 多項式階算法

    • 常量階 O(1)
    • 對數階 O(logn)
    • 線性階 O(n)
    • 線性對數階 O(nlogn)
    • 平方階 O(n2)、立方階 O(n3) ... k 次階 O(nk)
  • 非多項式api

    • 指數階 O(2n)
    • 階乘階 O(n!)

複雜度量級

空間複雜度分析

空間和複雜度和時間複雜度分析方法基本相似,表示算法的存儲空間與數據規模之間的增加關係。數據結構

原文地址數據結構和算法

相關文章
相關標籤/搜索