跳轉到

演算法關係全景圖

返回目錄


SearchX 工程師的成長之路

                         SearchX 搜尋引擎系統
        ┌───────────────────────┼───────────────────────┐
        ▼                       ▼                       ▼
   ┌─────────┐            ┌─────────┐            ┌─────────┐
   │  爬蟲   │            │  索引   │            │  搜尋   │
   │ Crawler │            │ Indexer │            │ Search  │
   └────┬────┘            └────┬────┘            └────┬────┘
        │                      │                      │
        ▼                      ▼                      ▼
   ┌─────────┐            ┌─────────┐            ┌─────────┐
   │重複偵測 │            │壓縮儲存 │            │字串匹配 │
   │Q2 Rabin │            │Q4 Huffman│           │ Q1 KMP  │
   └─────────┘            └─────────┘            └─────────┘
        │                      │                      │
        └──────────────────────┼──────────────────────┘
              ┌────────────────┼────────────────┐
              ▼                ▼                ▼
         ┌─────────┐     ┌─────────┐     ┌─────────┐
         │分治處理 │     │動態更新 │     │查詢優化 │
         │Q3 Master│     │Q5 平攤  │     │Q6-8 NP  │
         └─────────┘     └─────────┘     └─────────┘

演算法技術全景圖

字串演算法家族

              字串匹配問題
       ┌───────────┼───────────┐
       ▼           ▼           ▼
   ┌───────┐   ┌───────┐   ┌───────┐
   │暴力法 │   │  KMP  │   │ Rabin │
   │O(nm)  │   │O(n+m) │   │ -Karp │
   └───────┘   └───┬───┘   └───┬───┘
                   │           │
              Prefix       Rolling
             Function        Hash
                   │           │
                   └─────┬─────┘
                  有限狀態自動機

演算法設計技巧

              演算法設計
    ┌─────────────┼─────────────┐
    ▼             ▼             ▼
┌───────┐    ┌───────┐    ┌───────┐
│分治法 │    │貪心法 │    │ 動態  │
│Divide │    │Greedy │    │規劃DP │
└───┬───┘    └───┬───┘    └───┬───┘
    │            │            │
    ▼            ▼            ▼
Master      Exchange      狀態轉移
Theorem     Argument        方程

    │            │            │
    ▼            ▼            ▼
Merge K     Huffman      背包、LCS
Lists       Coding       (見資料結構專題)

複雜度理論

                    計算複雜度
         ┌───────────────┼───────────────┐
         ▼               ▼               ▼
    ┌─────────┐    ┌─────────┐    ┌─────────┐
    │   P     │    │   NP    │    │ NP-Hard │
    │可解問題 │    │可驗證   │    │ 至少和  │
    └────┬────┘    └────┬────┘    │ NP 一樣 │
         │              │         │   難    │
         │              ▼         └────┬────┘
         │       ┌─────────┐          │
         │       │   NPC   │◄─────────┘
         │       │NP∩NP-Hard│
         │       └────┬────┘
         │            │
         └────────────┼────────────────┐
                      │                │
                      ▼                ▼
               ┌─────────┐      ┌─────────┐
               │歸約證明 │      │近似演算 │
               │Reduction│      │Algorithm│
               └─────────┘      └─────────┘

考點對照表

按年度分布

年度 字串 分治 貪心 平攤 NP
114 Q16 KMP - - Q18 Binary Counter Q17, Q19
113 - - - Q3 Dynamic Array Q13 Vertex Cover
112 Q16 Prefix Q15 Merge K Q3 Huffman - -
110 Q10,11 KMP - - - Q12 NPC
109 - - - - Q15 Reduction
107 - - Q5 Activity Q? -

按主題分類

主題 核心概念 經典題型 難度
KMP Prefix Function 計算失敗函數、DFA ★★★
Rabin-Karp Rolling Hash 多模式匹配 ★★☆
分治法 Master Theorem Merge K Lists ★★★
貪心法 Exchange Argument Huffman, Activity ★★★
平攤分析 Potential Method Dynamic Array, Counter ★★★★
NP 基礎 P/NP/NPC 定義 類別關係推理 ★★★
NP 證明 Reduction 3-SAT → 各種問題 ★★★★
近似 近似比 Vertex Cover, Set Cover ★★★★

時間複雜度速查表

字串演算法

演算法 時間複雜度 空間複雜度
暴力匹配 \(O(nm)\) \(O(1)\)
KMP \(O(n+m)\) \(O(m)\)
Rabin-Karp \(O(n+m)\) 期望 \(O(m)\)
多模式 Rabin-Karp \(O(n \cdot k + m)\) \(O(m)\)

分治法經典問題

問題 遞迴式 時間複雜度
Merge Sort \(T(n) = 2T(n/2) + O(n)\) \(O(n \log n)\)
Quick Sort \(T(n) = 2T(n/2) + O(n)\) \(O(n \log n)\) 期望
Merge K Lists \(T(k) = 2T(k/2) + O(kn)\) \(O(kn \log k)\)
Closest Pair \(T(n) = 2T(n/2) + O(n)\) \(O(n \log n)\)

貪心與近似

問題 時間複雜度 近似比
Huffman Coding \(O(n \log n)\) 最佳
Activity Selection \(O(n \log n)\) 最佳
Vertex Cover \(O(E)\) 2
Set Cover \(O(mn)\) \(O(\ln n)\)

公式速查表

Master Theorem

\[T(n) = aT(n/b) + f(n)\]

\(c = \log_b a\)

Case 條件 結果
1 \(f(n) = O(n^{c-\epsilon})\) \(T(n) = \Theta(n^c)\)
2 \(f(n) = \Theta(n^c \log^k n)\) \(T(n) = \Theta(n^c \log^{k+1} n)\)
3 \(f(n) = \Omega(n^{c+\epsilon})\) \(T(n) = \Theta(f(n))\)

KMP Prefix Function

\[\pi[i] = \max\{k : P[0..k-1] = P[i-k+1..i]\}\]

Huffman 平均編碼長度

\[L = \sum_{i} f_i \cdot d_i\]

其中 \(f_i\) 是頻率,\(d_i\) 是深度。

平攤分析(Potential Method)

\[\hat{c}_i = c_i + \Phi_{i} - \Phi_{i-1}\]
\[\sum \hat{c}_i = \sum c_i + \Phi_n - \Phi_0\]

解題策略總結

遇到字串問題

字串匹配問題
單一模式?───是───► KMP(O(n+m))
多模式?───是───► Rabin-Karp 或 Aho-Corasick
近似匹配?───是───► DP(編輯距離)

遇到設計題

演算法設計
可以分解成相同子問題?───是───► 分治法
有最佳子結構 + 重疊子問題?───是───► DP
每步都有明顯最佳選擇?───是───► 貪心
      │                          (記得證明!)
回溯搜尋 / 其他技術

遇到複雜度問題

分析時間複雜度
是遞迴式?───是───► Master Theorem
有「偶爾很貴」的操作?───是───► 平攤分析
標準分析方法

遇到 NP 問題

證明 NP-Complete
      ├─► Step 1: 在 NP 中
      │       → 定義證據
      │       → O(poly) 驗證
      └─► Step 2: NP-Hard
              → 選適當來源問題
              → 設計 poly-time 轉換
              → 證明等價性

與資料結構專題的關係

主題 資料結構專題 演算法專題
Hash Table ✓ 完整
Heap ✓ 完整 ✗(Huffman 用到)
BST/AVL ✓ 完整
圖論 ✓ Dijkstra, MST, Max Flow
字串 ✓ KMP, Rabin-Karp
分治 部分(排序) ✓ 完整設計技巧
貪心 部分(MST) ✓ Huffman, 正確性證明
DP ✓ 背包、LCS
NP ✓ 完整覆蓋
平攤 部分(Hash) ✓ 完整方法

建議學習順序

  1. 資料結構專題(基礎工具)
  2. 演算法專題(設計技巧)
  3. 兩者交互練習

考前檢查清單

字串演算法

  • 能手算 KMP Prefix Function
  • 理解 KMP 為什麼是 \(O(n+m)\)
  • 能寫出 Rolling Hash 公式

分治法

  • 能用 Master Theorem 三種情況
  • 能分析 Merge K Sorted Lists

貪心法

  • 能建 Huffman Tree 並計算平均長度
  • 知道 Exchange Argument 怎麼用

平攤分析

  • 能用 Aggregate 分析 Dynamic Array
  • 能用 Potential 分析 Binary Counter
  • 知道三種方法的關係

NP 完備性

  • 能定義 P, NP, NP-Complete
  • 能做 NPC 類別推理
  • 知道經典歸約:3-SAT → Vertex Cover → Independent Set → Clique

近似演算法

  • 能證明 Vertex Cover 2-近似
  • 知道 Set Cover 是 \(O(\ln n)\) 近似

返回目錄