演算法圖解

📈 Big-O 成本分析

🎯 什麼情境該想到我

當你想判斷「這段程式在資料量變大時會不會爆掉」,或在兩個方案間比較效率時。

⚙️ 怎麼用

  1. 看主導項:只看輸入 n 變大時成長最快的部分,忽略常數與低階項。
  2. 常見等級(由快到慢):O(1) → O(log n) → O(n) → O(n log n) → O(n²) → O(2ⁿ)。
  3. 快速估:單層迴圈 O(n)、巢狀雙迴圈 O(n²)、每次砍半 O(log n)、排序多為 O(n log n)。
  4. 同時看空間複雜度:記憶體也可能是瓶頸(時間換空間的取捨)。

先估複雜度,再決定「資料規模下這個方案可不可行」,避免上線才發現慢爆。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • Big-O 是趨勢不是絕對;小 n 時常數/實作細節可能主導,別過早為漸進最佳而犧牲可讀性(見 工具-簡單清楚至上)。

🔗 相關工具

成長趨勢排序 O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ)

🗂 資料結構取捨

🎯 什麼情境該想到我

當你要決定「一堆資料該用什麼結構存」,或發現查找/插入很慢時。選對結構,效能天差地別。

⚙️ 怎麼用(依「主要操作」選)

  • 常隨機存取、少增刪 → 陣列(O(1) 索引)。
  • 常在中間插入/刪除 → 鏈結串列。
  • 常用鍵查值 / 去重 → 雜湊表(平均 O(1))。
  • 需要保持有序 + 範圍查詢 → 平衡樹 / 有序結構(O(log n))。
  • 常取最大/最小 → 堆積(Heap / 優先佇列)。
  • 關係/連通/最短路 → 圖。

先問:這份資料最常做哪個操作? 那個操作要快,就選對應結構。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • 選擇是「操作頻率」的取捨,沒有全能結構;查得快的常插得慢,反之亦然。

🔗 相關工具

陣列 vs 鏈結串列 陣列隨機存取快、插入慢;鏈結串列插入快、查找慢

雜湊表 平均 O(1) 查找,代價是無序與雜湊衝突

樹/堆積/圖 有序查找、取極值、關係網路各有專屬結構

🧠 演算法設計策略

🎯 什麼情境該想到我

當你面對一個計算/最佳化問題、暴力解太慢、想不到更好解法時。先辨認它屬於哪種策略。

⚙️ 怎麼用(辨認問題型態 → 套對應策略)

  1. 分治(Divide & Conquer):能把問題拆成同型的小問題、各自解完再合併 → 如合併排序、快排、二分。
  2. 貪婪(Greedy):每一步都取「當下看起來最好」的選擇即可得全域最佳 → 如區間排程、Huffman。(要能證明貪婪選擇性質)
  3. 動態規劃(DP):有重疊子問題 + 最佳子結構 → 把子問題結果記下來(記憶化/表格),避免重算 → 如背包、最長公共子序列。
  4. 想不到時:先寫暴力解,再找「重複計算」或「可拆解」的結構往上述三類靠。

🧪 我實際套用的紀錄

  • 2026-07-15:(待填)

⚠️ 注意

  • 貪婪不是萬用——很多問題貪婪會得到次佳解,需要 DP。用小例子驗證。

🔗 相關工具

分治 拆小再合併,如快速排序/合併排序

貪婪 每步取當下最佳,簡單但不一定全域最佳

動態規劃 重疊子問題記憶化,避免重複計算

🔎 搜尋與排序

二分搜尋 有序資料下 O(log n)

遞迴 用基準情形+自我呼叫描述問題

常見排序的複雜度 快排/合併 O(n log n)、氣泡/插入 O(n²)