內容已複查
25 分鐘 · 4 張概念卡 · 1 題對應考古題

圖演算法與設計策略:從相依關係到可證明步驟

本頁為依教材與考古題整理的原創摘要;考古題答案經技術覆核,但不是官方答案。

考古題證據邊界: im-it-ds-algorithm-design 在 canonical question metadata 中沒有 direct primary past-paper refs;im-it-ds-graphs 本課也只有 1 題內容完整且可直接使用的 topological-sort ref。112-26 題面破碎,已排除。其餘 graph 與 algorithm-design 內容是 reviewed MIT algorithms source 支撐的 foundational coverage,不宣稱歷屆高頻。

第一次接觸也沒關係

這堂先懂這些詞

先記住白話意思,不必急著背英文。看到正文時,再把正式名稱接回來。

演算法設計策略

也會看到:greedy、divide-and-conquer、dynamic programming、invariant

Greedy 每步選眼前最佳,分治拆成獨立子題,動態規劃重用重疊子題答案。

生活例子:
像每次拿最大硬幣、分組各自整理、把算過的小問題寫在備忘錄。
別搞混:
看到最佳化問題不能直接套 greedy;必須證明局部選擇能導向全域答案。

大 O 複雜度

也會看到:Big O、time complexity、O(n)、時間複雜度

描述輸入變大時,演算法所需時間或空間的成長速度。

生活例子:
排 10 人與排 1 萬人時,工作量增加多快比小規模快幾秒更重要。
別搞混:
Big O 不是精確秒數,也不能忽略資料規模與常數成本。

拓樸排序、最短路徑與生成樹

也會看到:topological sort、shortest path、spanning tree、MST

拓樸排序安排相依先後;最短路徑找兩點間最低成本;最小生成樹用最低總成本連通所有點。

生活例子:
排課先後、導航最快路線與最低成本鋪設全區網路,是三種不同問題。
別搞混:
MST 不保證任意兩點間的路徑都是最短路徑。

圖的走訪

也會看到:BFS、DFS、breadth-first search、depth-first search、廣度優先、深度優先

BFS 逐層探索,DFS 則沿一條路深入後再回頭。

生活例子:
找最近的朋友關係像 BFS,探索迷宮一條路到底像 DFS。
別搞混:
兩者走訪順序不同,適用問題與記憶體成本也不同。

用 BFS、DFS、topological sort、MST 與最短路徑建立圖問題辨識框架,再比較 greedy、divide-and-conquer 與 dynamic programming 的前提及正確性論證。

先抓住這幾件事

  • 依目標選擇 BFS、DFS 或 topological sort
  • 說明 spanning tree、MST 與 shortest path 的差異
  • 區分 greedy、divide-and-conquer 與 dynamic programming
  • 用 invariant、exchange argument 或 induction 描述正確性證據

先想像這個場景

校園活動排程與網路佈線

學生會要排有先修關係的活動、找校園各點的最低總佈線成本,還要設計在尖峰前完成的演算法。三個問題都畫成圖,卻不能用同一個答案。

先別急著往下看,花十秒想一想:

若活動相依圖出現 A 等 B、B 又等 A,排程表能否靠換順序解決?最低總佈線是否等於入口到禮堂的最短路?

把故事換成電腦語言

生活中的角色對應到技術概念
活動必須在其前置工作完成後開始DAG 與 topological order
從入口逐層找最少轉乘站數BFS 與無權 shortest path
讓所有校園據點連通且總線材最少Minimum spanning tree
把大型活動拆成獨立小組後合併結果Divide-and-conquer
記錄重複子排程的最佳成本避免重算Dynamic programming

題目出現這些字,先想到

  • 看到 prerequisite/order:先檢查 directed acyclic,cycle 使 topological sort 不存在。
  • 看到 unweighted minimum edges:BFS;要深入探索 cycle/連通性常用 DFS。
  • 看到 connect all vertices with minimum total weight:MST,不是 single-source shortest path。
  • 看到 greedy/DP:要求局部選擇證明或 overlapping subproblems,並補 correctness 論證。

1.Graph 把物件與關係分開

Graph G=(V,E) 以 vertices 表示物件、edges 表示關係;邊可有方向與權重。BFS 逐層展開,適合無權圖最少邊數距離;DFS 沿一路深入後回溯,適合連通性、cycle 與結構探索。

  • Directed edge 有方向
  • Weighted edge 帶成本
  • BFS 使用 queue
  • DFS 常用 stack 或 recursion

2.Topological sort 只屬於 DAG

Topological order 讓每條 u→v 都滿足 u 出現在 v 前面。若有 directed cycle,環上每個工作都要求另一個先完成,無法形成線性順序。Kahn 方法反覆取 indegree 0 節點;DFS 方法依完成時間反向排列並偵測 back edge。

  • 不是所有 directed graph 都可排序
  • 答案可能不唯一
  • 若輸出節點少於 |V| 表示存在 cycle
  • 不要求圖 fully connected

3.MST 與 shortest path 回答不同問題

Spanning tree 連接全部 vertices 且無 cycle,n 個 vertices 有 n−1 條邊;MST 最小化整棵樹總權重。Shortest path 則最小化特定起終點路徑成本,不要求連接所有 vertices。Prim 依 cut property 安全加入跨 cut 的最輕邊。

  • MST 需要 connected undirected graph
  • 最短路徑樹不一定是 MST
  • 權重相同時 MST 可能不唯一
  • Dijkstra 不適用負權邊

4.先辨認子問題關係再選設計策略

Greedy 每步作局部安全選擇,需證明 greedy-choice property;divide-and-conquer 把問題拆成大致獨立子問題後合併;dynamic programming 適用 overlapping subproblems 與 optimal substructure,儲存狀態避免重算。

  • 看到最優問題不代表 greedy 一定正確
  • Memoization 是 top-down DP
  • Tabulation 是 bottom-up DP
  • Merge sort 是典型 divide-and-conquer

5.複雜度之外還要證明答案正確

演算法答案至少說清楚 input、output、步驟、終止與 complexity。Loop invariant 可描述每輪前後維持的真命題;exchange argument 常證明 greedy 解可轉換成含某個 greedy choice 的最優解;induction 可沿輸入規模或 DP 狀態證明。

  • 測過範例不是 correctness proof
  • Invariant 要有初始化、維持、終止
  • Complexity 不等於 correctness
  • 反例可推翻不成立的 greedy rule

一起拆題目

範例 1課程相依 A→C、B→C、C→D,給一個 topological order。

  1. A、B indegree 為 0,可先任選
  2. 取 A、B 後 C indegree 變 0
  3. 最後取 D

所以答案是:A,B,C,D 或 B,A,C,D 均合法。

範例 2找零問題硬幣 {1,3,4}、金額 6,永遠先取最大硬幣的 greedy 是否最佳?

  1. Greedy 取 4+1+1,共 3 枚
  2. 另一解為 3+3,共 2 枚
  3. 出現反例,故此幣制下 greedy rule 不正確

所以答案是:不正確;可用 DP 求每個金額的最少硬幣數。

這裡最容易選錯

  • 在有 cycle 的 directed graph 上要求 topological order
  • 把 BFS 與 DFS 的 queue/stack 對調
  • 把 MST 當成任意兩點 shortest path
  • 看到 optimal 就直接套 greedy
  • 只分析 Big-O、不說明演算法為何正確

換你快速判斷

先在心中作答,再展開答案。答不出來時,回頭找本課的對照關係。

1Topological sort 的必要圖形條件是什麼?

必須是 directed acyclic graph(DAG)。有 directed cycle 就不存在能滿足所有先後關係的線性順序。

圖不必 fully connected,合法 order 也可能不唯一。

2Minimum spanning tree 與 shortest path 的目標有何不同?

MST 以最小總邊權連通全部 vertices;shortest path 最小化特定起終點的路徑成本。

Connected graph 的 spanning tree 有 n−1 edges;最短路徑樹不必是 MST。

3如何區分 greedy、divide-and-conquer 與 dynamic programming?

Greedy 逐步做可證安全的局部選擇;divide-and-conquer 合併大致獨立子問題;DP 儲存重疊子問題的狀態。

DP 通常還需要 optimal substructure;最優化問題不代表 greedy 一定成立。

4分析出 Big-O 之後,為何仍需要 correctness proof?

Big-O 只描述資源成長,不證明演算法輸出符合規格;還需 invariant、induction、exchange argument 等證據。

測試數個 examples 也不能取代對所有合法 inputs 的正確性論證。

最後用考古題驗證

本課連結的題目都已通過可重現的技術覆核,可逐題練習與判分。

開始本課考古題練習

參考來源