Algorithms 演算法 - paulip114/blog GitHub Wiki
常見演算法(Algorithms)總整理
🧮 一、排序演算法(Sorting Algorithms)
演算法 | 時間複雜度 | 穩定性 | 適用情境 |
---|---|---|---|
Bubble Sort | O(n²) | ✅ | 教學用途、概念簡單 |
Selection Sort | O(n²) | ❌ | 教學用途 |
Insertion Sort | O(n²) | ✅ | 資料幾乎已排好(小規模) |
Merge Sort | O(n log n) | ✅ | 穩定高效,適合大型資料集 |
Quick Sort | 平均 O(n log n) / 最差 O(n²) | ❌ | 實務中非常常用,平均效能優異 |
Heap Sort | O(n log n) | ❌ | 不需額外空間、實作優先順序排序 |
Radix Sort | O(nk) | ✅ | 適合大量數字排序(如電話號碼、ID) |
🔍 二、搜尋演算法(Searching Algorithms)
演算法 | 時間複雜度 | 適用情境 |
---|---|---|
Linear Search | O(n) | 小資料集或無序資料 |
Binary Search | O(log n) | 已排序的陣列 |
Depth-First Search(DFS) | O(V + E) | 圖 / 樹搜尋、遞迴遍歷 |
Breadth-First Search(BFS) | O(V + E) | 圖 / 樹搜尋、找最短路徑(不含權重) |
Ternary Search | O(log n) | 單峰函數找最大/最小(進階) |
🧠 三、分治 / 遞迴(Divide & Conquer / Recursion)
技巧 | 說明 | 常見應用 |
---|---|---|
Divide & Conquer | 問題分小塊 → 解決 → 合併 | Merge Sort、Quick Sort、Binary Search |
Recursion | 函數自己呼叫自己 | 樹遍歷、費氏數列、背包問題、子集 |
📦 四、貪婪演算法(Greedy Algorithms)
概念 | 說明 | 常見應用 |
---|---|---|
每一步都選擇當前最好(局部最優) → 嘗試達成整體最優 | 結果不一定最優,但效率高 | |
應用範例 | - 活動選擇問題 |
- 最小生成樹(Kruskal、Prim)
- Huffman 編碼
- 換零錢問題(部分情況)|
📚 五、動態規劃(Dynamic Programming, DP)
概念 | 說明 | 常見應用 |
---|---|---|
子問題 + 記憶化(Memoization) | 儲存重複子問題結果,避免重算 | 費氏數列、背包問題、最長公共子序列、剪繩子、找最大利潤 |
狀態轉移 | 根據前一狀態推導出目前狀態 | DP Table 或遞迴搭配 cache 實作 |
🌳 六、圖論演算法(Graph Algorithms)
演算法 | 說明 | 時間複雜度 | 適用情境 |
---|---|---|---|
BFS / DFS | 圖的基本遍歷 | O(V + E) | 尋找路徑、聯通區塊 |
Dijkstra | 單源最短路徑(非負權重) | O(E log V) | 地圖導航、最短距離 |
Bellman-Ford | 處理負權圖的最短路徑 | O(VE) | 有負邊權的圖 |
Floyd-Warshall | 所有點對點的最短路徑 | O(V³) | 小圖、全距離查詢 |
Prim / Kruskal | 最小生成樹 | O(E log V) | 網路連線、鋪電纜 |
Topological Sort | 有向無環圖(DAG)排序 | O(V + E) | 任務排序(前置條件處理) |
Union-Find | 判斷集合是否聯通、合併集合 | 幾乎 O(1) | 圖中連通區塊、社群判斷 |
🔢 七、數學與字串演算法
分類 | 演算法 | 用途 |
---|---|---|
數學 | 最大公因數(GCD)/ 最小公倍數(LCM) | 比例、分數、數字問題 |
快速冪(Fast Exponentiation) | 大數次方、加密運算 | |
篩法(Sieve of Eratosthenes) | 找所有質數 | |
組合 / 排列 | 統計、遞迴 / DFS | |
字串處理 | KMP、Rabin-Karp、Boyer-Moore | 字串比對演算法(比原始比對快) |
Trie | 前綴查詢、自動補字 | |
Z-algorithm | 找子字串(類似 KMP) |
🧠 八、其他常見演算法技巧
技巧 | 概念 | 用途 / 範例 |
---|---|---|
Sliding Window | 移動範圍來降低重複運算 | 最長子陣列、固定長度計算平均、兩指標 |
Two Pointers | 兩指標向中間移動,常配排序使用 | 合併排序陣列、找兩數和為 target |
Binary Search(進階) | 不只查單點,也可查最小最大條件 | 最小可行值、搜尋答案空間 |
Backtracking | 試錯、回朔法 | N 皇后、數獨、排列組合 |
Bit Manipulation | 位元操作 | 權限控制、找單一重複元素 |
-
📋 面試時很常考:
- 排序 + 搜尋(尤其是 Binary Search)
- BFS / DFS
- Sliding Window / Two Pointers
- Dynamic Programming(DP)
- 貪婪法 + Backtracking
-
⚙️ 實務開發中常遇到:
- HashMap / Stack / Queue
- 排序 + Trie(字串輸入)
- Graph(導航、推薦系統)
- DP(優化成本、資源分配)