演算法圖解
📈 Big-O 成本分析
🎯 什麼情境該想到我
當你想判斷「這段程式在資料量變大時會不會爆掉」,或在兩個方案間比較效率時。
⚙️ 怎麼用
- 看主導項:只看輸入 n 變大時成長最快的部分,忽略常數與低階項。
- 常見等級(由快到慢):O(1) → O(log n) → O(n) → O(n log n) → O(n²) → O(2ⁿ)。
- 快速估:單層迴圈 O(n)、巢狀雙迴圈 O(n²)、每次砍半 O(log n)、排序多為 O(n log n)。
- 同時看空間複雜度:記憶體也可能是瓶頸(時間換空間的取捨)。
先估複雜度,再決定「資料規模下這個方案可不可行」,避免上線才發現慢爆。
🧪 我實際套用的紀錄
- 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:(待填)
⚠️ 注意
- 選擇是「操作頻率」的取捨,沒有全能結構;查得快的常插得慢,反之亦然。
🔗 相關工具
- 工具-時間複雜度分析、工具-儲存引擎B-Tree與LSM-Tree(DB 層的資料結構取捨)
陣列 vs 鏈結串列 陣列隨機存取快、插入慢;鏈結串列插入快、查找慢
雜湊表 平均 O(1) 查找,代價是無序與雜湊衝突
樹/堆積/圖 有序查找、取極值、關係網路各有專屬結構
🧠 演算法設計策略
🎯 什麼情境該想到我
當你面對一個計算/最佳化問題、暴力解太慢、想不到更好解法時。先辨認它屬於哪種策略。
⚙️ 怎麼用(辨認問題型態 → 套對應策略)
- 分治(Divide & Conquer):能把問題拆成同型的小問題、各自解完再合併 → 如合併排序、快排、二分。
- 貪婪(Greedy):每一步都取「當下看起來最好」的選擇即可得全域最佳 → 如區間排程、Huffman。(要能證明貪婪選擇性質)
- 動態規劃(DP):有重疊子問題 + 最佳子結構 → 把子問題結果記下來(記憶化/表格),避免重算 → 如背包、最長公共子序列。
- 想不到時:先寫暴力解,再找「重複計算」或「可拆解」的結構往上述三類靠。
🧪 我實際套用的紀錄
- 2026-07-15:(待填)
⚠️ 注意
- 貪婪不是萬用——很多問題貪婪會得到次佳解,需要 DP。用小例子驗證。
🔗 相關工具
- 工具-時間複雜度分析 —— 挑策略的量尺,判斷換策略後真的降階了還是只是換寫法
- 工具-程式問題解決策略 —— 上位流程,這張是它「辨認問題類型」那一步的專用工具箱
分治 拆小再合併,如快速排序/合併排序
貪婪 每步取當下最佳,簡單但不一定全域最佳
動態規劃 重疊子問題記憶化,避免重複計算
🔎 搜尋與排序
二分搜尋 有序資料下 O(log n)
遞迴 用基準情形+自我呼叫描述問題
常見排序的複雜度 快排/合併 O(n log n)、氣泡/插入 O(n²)