O(n):「時間複雜度 」和「空間複雜度 」的解題技巧

在本文中,我對時間複雜度與空間複雜度進行了詳細解說,並通過實例來說明這些概念。我解釋了如何用 O 符號表示演算法的效率,並提供了多種常見複雜度類型的例子,包括 O(1)、O(n)、O(log n)、O(n^2)、O(n log n)、O(2^n) 和 O(n!),這有助於更好地理解各類演算法的執行效率。

O(n):「時間複雜度 」和「空間複雜度 」的解題技巧
Photo by Casey Horner / Unsplash
描述時間複雜度和空間複雜度皆用 O 表示
  • 空間複雜度可以用來衡量占用多少記憶體空間
  • 時間複雜度可以用來衡量需要多少時間去處理

實作演算法時若能以較低之空間複雜度/空間複雜度則為較佳解,反之。

圖片來源:  初學者學演算法|談什麼是演算法和時間複雜度


1. 空間複雜度

  • 假如永遠只使用一個變數,那空間複雜度就是 O(1)
  • 假設根據輸入值就會使用到多少變數,那空間複雜度就是 O(n)
  • 假設根據輸入值就會使用到多少變數,且每進入迴圈一次就跑 n 個變數,則時間複雜度為 O(n^2)
// 空間複雜度是 O(1)
function Space(n){
  let a = 1
}

// 空間複雜度是 O(n)
function Space(n){
  let a = []
  for (let i = 0; i < n; i++) {
    a.push(i);
  }
}

// 空間複雜度是 O(n^2)
function Space(n){
  let a=[]
  for (var i = 0; i < n; i++) {
    a[i] = i
    for (var j = 0; j < n; j++) {
      a[i][j] = j
    }
  }
}

2. 時間複雜度

  • 假如永遠只跑一次迴圈,那時間複雜度就是 O(1)
  • 假設根據輸入值就會跑多少次迴圈,那時間複雜度就是 O(n)
  • 假設根據輸入值就會跑多少次迴圈,且每進入迴圈一次就跑 n 次迴圈,則時間複雜度為 O(n^2)
// 時間複雜度是 O(1)
function Time(n){
  console.log('1')
}

// 時間複雜度是 O(n)
function Time(n){
  for (let i = 0; i < n; i++) {
    console.log('1')
  }
}

// 時間複雜度是 O(n^2)
function Time(n){
  for (let i = 0; i < n; i++) {
    console.log('i:', i)
    for (let j = 0; j < n; j++) {
      console.log('j:', j)
    }
  }
}

3. 時間複雜度/範例演算法整理

1. O(1) : index 搜尋
  • 一步到位
2. O(log n): 二元搜尋
  • 階層數
3. O(n): 陣列遍歷
  • 線性
4. O(n log n) : Merge Sort
  • 線性 + 階層
5. O(n^2): Bubble Sort
  • 線性+線性
  • 超級分支
  • 底數漸大
  • 階層小
6. O(2^n): 費氏數列
  • 定速細胞分裂
  • 底數小
  • 階層漸大
7. O(n!): 排列組合
  • 高速細胞分裂
  • 底數從大到小
  • 階層漸大

資料來源:初學者學演算法|談什麼是演算法和時間複雜度用JavaScript學習資料結構與演算法 1:演算法與大 O 符號從 js 講解時間複雜度和空間複雜度超圖解!一次搞懂演算法