天天看點

資料結構與算法之美 複雜度分析(上)

  • ​​前言​​
  • ​​為什麼需要複雜度分析​​
  • ​​大O複雜度表示法​​
  • ​​如何進行複雜度分析​​
  • ​​幾種常見時間複雜度​​
  • ​​空間複雜度​​

文章是觀看王争老師的資料結構與算法之美所寫

資料結構與算法之美 複雜度分析(上)

前言

資料結構和算法本身是為了解決快和省的問題,我們希望代碼運作快,并且希望節省存儲空間,是以執行效率是一個很重要的考量名額,接下來要講的是時間複雜度和空間複雜度

為什麼需要複雜度分析

我們可以通過把代碼跑一遍,然後通過統計,監控等得到算法執行事件和占用的記憶體空間大小,這種方法是事後統計法,有很大的局限性:

  • 測試結果很依賴測試環境
  • 同樣的代碼在不同的機器執行速度可能不一樣
  • 測試結果受資料規模的影響很大
  • 比如排序

是以,我們需要用一個不需要具體的測試資料來測試,就可以粗略地估計算法的執行效率的方法,也就是時間,空間複雜度分析方法。

大O複雜度表示法

int cal(int n) {
   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
     sum = sum + i;
   }
   return sum;
 }      

假設每行代碼執行的時間都是一樣,為unit_time時間,那麼總的執行時間就是(2n+2)unit_time,所有代碼的執行時間T(n)和每行代碼的執行次數f(n)成正比。

我們可以把這個規律總結成一個公式。注意,大 O 就要登場了!

資料結構與算法之美 複雜度分析(上)
  • T(n)表示代碼的執行時間,n表示資料規模大小
  • f(n)表示每行代碼執行的次數總和
  • O表示代碼的執行時間T(n)和f(n)成正比
  • 上面所說的例子T(n)=O(2n+2),這就是大O時間複雜度表示法
  • 大 O 時間複雜度實際上并不具體表示代碼真正的執行時間,而是表示代碼執行時間随資料規模增長的變化趨勢,是以,也叫作漸進時間複雜度(asymptotic time complexity),簡稱時間複雜度。

如何進行複雜度分析

  1. 隻關注循環執行次數最多的一段代碼
  2. 加法法則:總複雜度等于量級最大的那段代碼的複雜度
  3. 乘法法則:嵌套代碼的複雜度等于嵌套内外代碼複雜度的乘積

幾種常見時間複雜度

資料結構與算法之美 複雜度分析(上)
  • 隻要代碼的執行時間不随 n 的增大而增長,這樣代碼的時間複雜度我們都記作 O(1)。

空間複雜度

繼續閱讀