🚀 演算法必修:一篇搞懂 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
跨越國界的程式人生
2會員
37內容數
自學程式,現為網頁開發工程師,同時擔任線上課程講師,專注於幫助自學程式的開發者找到理想工作。熱愛技術與分享,致力於將複雜的概念轉化為實用知識,讓更多人踏入軟體開發的世界。
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
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
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 *
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
Thumbnail
給定一個輸入非負整樹陣列nums,請找出k值,使得陣列中恰好有k個元素大於等於 k。如果無解,回傳-1。尋找k值的方法包括排序法和二分搜尋法,時間複雜度都為O(n log n),空間複雜度為O(1)。關鍵知識點是當解空間具有遞增或遞減的性質時,可以用二分搜尋法加快搜尋效率。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News