1. 程式人生 > >演算法筆記-複雜度分析1

演算法筆記-複雜度分析1

演算法複雜度分析

是什麼

什麼是演算法複雜度分析?
  • 通過時間和空間兩個維度來評估演算法和資料結構的效能。
  • 用時間複雜度 (時間漸進複雜度) 和空間複雜度 (空間漸進複雜度)兩個概念來描述效能問題,統稱複雜度。
  • 演算法複雜度描述的是演算法執行時間以及佔用空間與資料規模的關聯關係
  • 演算法複雜度分析是理論上的分析

為什麼

為什麼要做演算法複雜度分析
  • 有種效能分析叫做 ‘事後統計法’ 該方法是在程式結束之後根據記錄的執行時間,記憶體佔用情況,分析出系統的效能。該方法的侷限性就是極度依賴測試環境,測試資料的規模對測試結果影響很大。
  • 演算法複雜度分析則不依賴於測試環境,成本低,效率高
  • 演算法複雜度分析幫助我們瞭解程式的效能,指導我們編寫高效率的程式碼

怎麼辦

如何表示時間演算法複雜度
  • 用 T(n) = O(f(n)) 表示,其中 T(n) 表示程式碼執行的時間; n 表示資料規模的大小; f(n) 表示程式碼執行的總次數,公式中的 O ,表示程式碼的執行時間 T(n) 與 f(n) 表示式成正比

    演算法時間複雜度分析方法
  • 演算法時間複雜度全稱:時間漸進複雜度,表示演算法的執行時間與資料規模之間增長關係
  • 只關注迴圈次數最多的一段程式碼
    : 如果一段程式碼中包含一個 for 迴圈,則我們以 for 迴圈的執行次數 n 作為該段程式碼的時間複雜度,記為: O(n)
  • 巢狀程式碼的複雜度等於內層與外層程式碼複雜度之積
    : 如果一段程式碼中包含一個 for 迴圈,而這個 for 迴圈體中又包含了一個相同的 for 迴圈,那麼時間複雜度就為: t(n) * g(n) ,假設 t(n) = g(n^2) ,則最終時間複雜度記為: O(n^3)
  • 只關注複雜度量級最大的那段程式碼
    : 如果一段程式碼包含兩個 for 迴圈,其中一個 for 迴圈體中再次包含一個 for 迴圈,則該段程式碼的時間複雜度應為:
    t(n) + g(n^2) 如果n足夠大的時候,則 t(n) 值可忽略不計,只取 g(n^2) 的值,那麼時間複雜度為: O(n^2)

    常見演算法時間複雜度例項
  • 常量階 O(1)
  • 對數階 O(logn)
  • 線性階 O(n)
  • 線性對數階 O(nlogn)
  • 平方階 O(n^2) 立方階 O(n^3)
  • 指數階 O(2^n)
  • 階乘階 O(n!)

    空間複雜度分析方法
  • 演算法空間複雜度全稱:空間漸進複雜度,表示演算法的儲存空間與資料規模之間增長關係
  • 演算法空間複雜度分析比較簡單直接,只需統計程式碼執行時需要申請的空間大小。
  • 常見的空間複雜度例項有 O(1),O(n),O(n^2)

    總結

    本文創作靈感來源於 極客時間 王爭老師的《資料結構與演算法之美》課程,通過課後反思以及借鑑各位學友的發言總結,現整理出自己的知識架構,以便日後溫故知新,查漏補缺。

初入演算法複雜度分析,必是步履蹣跚,一路磕磕絆絆跌跌撞撞。看不懂別慌,也別忙著總結,先讀五遍文章先,無他,唯手熟爾~
與諸君共勉

關注本人公眾號,第一時間獲取最新文章釋出,見證你我一起進步!