🚀 演算法必修:一篇搞懂 Big O Notation!

更新 發佈閱讀 6 分鐘

軟體工程師職涯升級計畫啟動!立即預約職涯諮詢、履歷健檢或模擬面試👈,為您的加薪做好準備!


🤔 為什麼要懂 Big O?

在技術面試中,寫出能跑的程式只是基本,真正的關鍵是:

  • 你的程式現在的 時間複雜度 (Time Complexity) 是多少?
  • 當資料變大時,效能會怎麼變?
  • 你能不能再優化?

懂 Big O,就像懂「演算法的語言」。沒有這個基礎,談優化就像盲劍客亂揮劍。


Big O 是什麼?

Big O Notation:描述一個演算法在「最壞狀況」下,執行時間隨輸入資料量成長的速度。

常見的三種情境:

  • 🟢 Best Case(最佳狀況)
  • 🔴 Worst Case(最壞狀況 → Big O 主要關注)
  • 🟡 Average Case(平均狀況,較接近真實情境)

🔑 常見時間複雜度

O(1) — Constant Time

無論輸入多大,執行時間都一樣。

function getFirst(arr) {
return arr[0]
}

console.log(getFirst([10, 20, 30])) // 10
console.log(getFirst([99, 88, 77, 66, 55])) // 99

O(n) — Linear Time

輸入增加,執行時間也等比例增加。

function printAll(arr) {
for (let item of arr) {
console.log(item)
}
}

printAll([1, 2, 3])
// 輸出: 1, 2, 3
printAll([1, 2, 3, 4, 5, 6])
// 輸出: 1, 2, 3, 4, 5, 6

O(n²) — Quadratic Time

巢狀迴圈最常見,輸入越大,效能急速下降。

function printPairs(arr) {
for (let i of arr) {
for (let j of arr) {
console.log(`(${i}, ${j})`)
}
}
}

printPairs([1, 2, 3])
// 共 9 組組合

O(log n) — Logarithmic Time

常見於「二分法」演算法,例如 Binary Search

function binarySearch(arr, key) {
let low = 0, high = arr.length - 1
while (low <= high) {
let mid = Math.floor((low + high) / 2)
if (arr[mid] === key) return mid
arr[mid] < key ? low = mid + 1 : high = mid - 1
}
return -1
}

console.log(binarySearch([1,2,3,4,5], 3)) // index 2

每次對半切,資料越大,效率優勢越明顯。


O(n log n) — Divide & Conquer

常見於排序演算法:Merge Sort、Quick Sort

  • 拆分:O(log n)
  • 合併:O(n)
  • 總和:O(n log n)
// 簡化版 Merge Sort
function mergeSort(arr) {
if (arr.length <= 1) return arr
let mid = Math.floor(arr.length / 2)
let left = mergeSort(arr.slice(0, mid))
let right = mergeSort(arr.slice(mid))
return merge(left, right)
}

function merge(left, right) {
let result = []
while (left.length && right.length) {
result.push(left[0] < right[0] ? left.shift() : right.shift())
}
return [...result, ...left, ...right]
}

console.log(mergeSort([5, 3, 8, 2, 1, 4]))
// [1, 2, 3, 4, 5, 8]

圖像化理解

  • O(1):🚗 平直的高速公路
  • O(log n):📉 趨緩的上升曲線
  • O(n):📈 線性成長
  • O(n log n):⚖️ 稍微加速的線性
  • O(n²) 以上:💣 資料大就炸掉

👉 Big O 只看「最大影響因子」:

  • 3n + 100 → O(n)
  • n² + n → O(n²)
raw-image

學習小技巧

  1. 白板練習:寫之前先講出複雜度。
  2. 持續優化:嘗試把 O(n²) 變成 O(n log n) 或 O(n)。
  3. 養成習慣:每次寫 function,問自己「這是什麼 Big O?」。

Big O 不是數學課題,而是 理解程式效能的語言

當你能流利說出「這段程式是 O(n log n)」,不只面試更有自信,日常開發也會更有結構感。

💡 記住:

  • O(1) 與 O(log n) = 🚀 飛快
  • O(n) = ✅ 可接受
  • O(n²) 以上 = ⚠️ 大型資料就危險

掌握 Big O,你就掌握了寫出高效程式的關鍵! 🚀


留言
avatar-img
留言分享你的想法!
avatar-img
跨越國界的程式人生
3會員
40內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
2025/09/04
本文深入探討常見演算法,例如線性搜尋、二分搜尋、以及選擇排序、氣泡排序、插入排序、合併排序等,並以LeetCode題目範例說明如何優化程式碼效能,提升軟體工程師職涯競爭力。
Thumbnail
2025/09/04
本文深入探討常見演算法,例如線性搜尋、二分搜尋、以及選擇排序、氣泡排序、插入排序、合併排序等,並以LeetCode題目範例說明如何優化程式碼效能,提升軟體工程師職涯競爭力。
Thumbnail
2025/09/01
深入淺出遞迴函式與動態規劃的原理與應用,透過費氏數列案例比較兩種方法的效率,並說明動態規劃的優勢與實作技巧,提升程式設計能力。
Thumbnail
2025/09/01
深入淺出遞迴函式與動態規劃的原理與應用,透過費氏數列案例比較兩種方法的效率,並說明動態規劃的優勢與實作技巧,提升程式設計能力。
Thumbnail
2025/09/01
軟體工程師職涯諮詢、履歷健檢與模擬面試服務,助您加薪!文章深入淺出圖 (Graph) 資料結構,涵蓋有向圖、無向圖、鄰接矩陣、鄰接列表、LeetCode 實戰範例 (Number of Islands),助您提升演算法能力。
Thumbnail
2025/09/01
軟體工程師職涯諮詢、履歷健檢與模擬面試服務,助您加薪!文章深入淺出圖 (Graph) 資料結構,涵蓋有向圖、無向圖、鄰接矩陣、鄰接列表、LeetCode 實戰範例 (Number of Islands),助您提升演算法能力。
Thumbnail
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
Thumbnail
我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。 回顧我們在AI說書 - 從0開始 - 6中說當Context長度是n,且每個字用d維度的向量表示時有以下結論: Attention Layer的複雜度是O(n^2 *
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News