108 年 國立成功大學資訊工程系碩士班《程式設計》
第 1 題12 分
Answer True or False for the following statements. Give correct answers or explain clearly for False statements.
(1) Let G be a graph with e edges and v vertices. If G is represented by adjacency matrix, DFS requires time. (4%)
(2) The path from vertex u to vertex v on a minimal cost spanning tree of an undirected graph G is also a shortest path from u to v. (4%)
(3) In static hashing, the worst-case number of comparisons needed for a successful search is for open addressing. The number could be reduced to by using chaining method. (4%)
登入後即可作答並保存紀錄。
這部分考驗對圖論基本概念、演算法時間複雜度、資料結構的理解。
(1) False。
* 核心觀念:DFS 的時間複雜度與圖的表示法(鄰接矩陣 vs 鄰接串列)和圖的邊數 (e) 及頂點數 (v) 有關。
* 詳解:
* 當圖使用鄰接矩陣表示時,DFS 演算法需要遍歷所有頂點,對於每個頂點,需要檢查所有可能的邊,也就是檢查該頂點與其他所有頂點之間是否存在邊。一個頂點的鄰接矩陣表示需要 的時間來尋找所有相鄰的頂點。由於有 個頂點,總時間複雜度為 。
* 題目敘述 DFS 需要 時間,這是錯誤的。DFS 的時間複雜度,不論圖的表示法為何,通常與 和 有關。對於鄰接矩陣,是 ;對於鄰接串列,是 。
* 【答案】False
(2) False。
* 核心觀念:最小生成樹 (MST) 的邊不一定構成最短路徑。
* 詳解:
* 最小生成樹 (MST) 的目標是連接所有頂點,且總權重最小。它保證了連通性,但並不保證路徑上的邊權總和最小。
* 最短路徑演算法(如 Dijkstra 或 Bellman-Ford)尋找的是兩個特定頂點之間權重總和最小的路徑。
* 舉例:假設有一個圖 G,頂點為 A, B, C。邊為 (A,B) 權重 1,(B,C) 權重 1,(A,C) 權重 10。
* MST 可能會選擇邊 (A,B) 和 (B,C),總權重為 2。
第 2 題18 分
Consider the following AOE network:
[Image of an AOE network graph with nodes labeled V0 to V12 and edges representing tasks with associated durations. The graph shows dependencies and parallel processing possibilities.]
🖼️【此處有附圖,請對照原卷】
(1) Obtain and for all activity . (7%)
(2) List all critical activities. (7%)
(3) List all critical paths. (4%)
登入後即可作答並保存紀錄。
核心觀念
AOE(Activity on Edge)網路中:
- 頂點代表事件。
- 邊代表活動,邊上的數字為活動工期。
- :事件 的最早發生時間。
- :事件 的最晚發生時間。
- 對活動 ,其:
其中 為活動 的工期。
若 ,表示活動沒有延遲餘裕,為關鍵活動。
解題方法
由圖可得各活動如下:
| 活動 | 起點 → 終點 | 工期 |
|---|---|---|
| 9 | ||
| 4 | ||
| 7 | ||
| 2 | ||
| 2 | ||
| 4 | ||
| 5 | ||
| 7 | ||
| 7 | ||
| 1 | ||
| 1 | ||
| 3 |
1. 計算事件最早時間
由起點向終點進行正向計算:
因此專案最短完成時間為 。
2. 計算事件最晚時間
由終點向起點進行反向計算,令:
接著:
(1) 各活動的 與
第 3 題20 分
Given the following 8 numbers:
8, 23, 1, 4, 16, 11, 22, 30, 18, 27, 15, 10, 20, 17, 21, 13, 38, 19, 24, 32, 35, 25
🖼️【此處有附圖,請對照原卷】
(1) Draw the winner tree. (5%)
(2) Draw the restructured winner tree after one record has been output. (5%)
(3) Draw the loser tree based on the answer of question (2). (5%)
(4) Derive the total required time to merge records through a winner tree with runs. (5%)
登入後即可作答並保存紀錄。
核心觀念
依原卷圖,資料是由左至右排列的 8 個已排序 runs,每個 run 有 3 筆資料:
| Run | 資料 |
|---|---|
進行遞增合併時,每個 run 的目前最前端元素放在樹的葉節點。Winner tree 的每個內部節點儲存兩個子樹中的較小值,根節點即為下一筆輸出的資料。
輸出根節點後,從相同 run 取出下一筆資料,沿著該葉節點到根節點的路徑更新。
解題方法
(1) Winner tree
初始各 run 的前端資料為
第一層比較:
第二層比較:
根節點比較:
Winner tree 如下:
1 (R4)
/ \
1 (R4) 3 (R6)
/ \ / \
5 (R1) 1 (R4) 3 (R6) 11 (R8)
/ \ / \ / \ / \
5(R1) 8(R2) 23(R3) 1(R4) 4(R5) 3(R6) 16(R7) 11(R8)
因此第一筆輸出為 ,來源是 。
(2) 輸出一筆後的 Winner tree
輸出 的 後, 的下一筆資料為 ,因此葉節點更新為
只需更新 到根節點的路徑:
更新後的 Winner tree 為:
3 (R6)
/ \
5 (R1) 3 (R6)
/ \ / \
5 (R1) 15 (R4) 3 (R6) 11 (R8)
/ \ / \ / \ / \
5(R1) 8(R2) 23(R3) 15(R4) 4(R5) 3(R6) 16(R7) 11(R8)
所以第二筆輸出為 ,來源是 。
(3) Loser tree
Loser tree 的內部節點儲存每場比較的敗者,最上方另記錄整棵樹的總勝者。
根據第 (2) 題的資料進行比較:
第 4 題10 分
How can we prove the given problem is NP-complete?
登入後即可作答並保存紀錄。
這題考驗對 NP-completeness 證明方法的理解。證明一個問題是 NP-complete 通常需要兩部分:
-
證明問題屬於 NP (Non-deterministic Polynomial time):
- 這意味著,如果給定一個問題的「解的候選」,我們可以在多項式時間內驗證這個候選解是否是正確的。
- 驗證過程通常是:對於一個給定的解(例如,一個圖的子集、一個解的路徑等),檢查它是否滿足問題的所有約束條件,並判斷其是否為一個「可行解」。如果問題還要求優化(例如,最小化或最大化某個值),則還需檢查該解是否達到或超過了某個目標值。
-
證明問題是 NP-hard (NP-困難):
- 這意味著,任何一個已知的 NP-complete 問題都可以在多項式時間內歸約 (reduce) 到我們正在考慮的問題。
- 歸約的含義是:我們有一個已知的 NP-complete 問題 ,以及一個我們想要證明是 NP-hard 的問題 。如果我們能將 的任何一個實例轉換成 的一個實例,並且這個轉換過程可以在多項式時間內完成,同時原問題 的解能夠對應到轉換後問題 的解,那麼 就是 NP-hard。
- 通常,歸約是通過構造一個從 到 的多項式時間轉換函數來完成的。這個函數將 的輸入轉換成 的輸入,使得 有解若且唯若 有解(或 的優化解對應到 的優化解)。
- 常見的已知 NP-complete 問題包括:SAT (Satisfiability), 3-SAT, Vertex Cover, Hamiltonian Path/Cycle, Clique, Subset Sum 等。通常會選擇其中一個來進行歸約。
第 5 題10 分
Give an algorithm that determines whether or not a given undirected graph G=(V,E) contains a cycle. Your algorithm should run in O(V) time, independent of |E|.
登入後即可作答並保存紀錄。
核心觀念
本題要求判斷無向圖 是否含有 cycle,且時間複雜度必須為 ,不能依賴 。
關鍵定理是:
無 cycle 的無向圖是一片森林;若有 個頂點,森林最多只有 條邊。
因此:
- 若 ,圖必定含有 cycle。
- 若 ,則 ,此時使用 DFS 或 BFS 檢查 cycle,總時間仍為 。
這是本題能達成「與 無關的 」的核心。
解題方法
先檢查邊數:
- 若 ,直接回傳「含有 cycle」。
- 若 ,對圖執行 DFS。
- DFS 遇到尚未拜訪的頂點,代表開始一個新的 connected component。
- 在無向圖中,若目前頂點 的鄰點 已經拜訪過,且 不是 的 parent,則發現 cycle。
可用以下偽程式碼:
HasCycle(G):
n ← |V|
m ← |E|
if m ≥ n:
return true
for each vertex v ∈ V:
visited[v] ← false
parent[v] ← NIL
for each vertex s ∈ V:
if visited[s] = false:
if DFS(s, NIL) = true:
return true
return false
DFS(u, p):
visited[u] ← true
for each neighbor v of u:
if visited[v] = false:
parent[v] ← u
if DFS(v, u) = true:
return true
else if v ≠ p:
return true
return false
正確性說明
若 :
第 6 題10 分
True or false, please explain your answer.
(a) (2%) 0-1 knapsack problem can be solved by greedy strategy.
(b) (2%) In an undirected graph, we can apply the Depth-First-Search algorithm (DFS) to get tree edges and cross edges.
(c) (2%) Based on the top-down approach, we can use the memorization to reduce the time.
(d) (2%) Unweighted longest simple path problem has the optimal sub-structure.
(e) (2%) If we first apply the topology sort to a directed graph and then run the DFS algorithm on this graph, no back edges can be obtained.
登入後即可作答並保存紀錄。
這部分考驗對演算法設計、圖論、動態規劃等核心概念的理解,要求判斷幾個敘述的真偽並給予解釋。
(a) 0-1 knapsack problem can be solved by greedy strategy.
* 核心觀念:0-1 背包問題的貪婪策略。
* 詳解:0-1 背包問題是指,給定一個背包容量和一系列物品,每個物品有重量和價值,要求在不超過背包容量的前提下,選擇物品使得總價值最大。每個物品只能選擇一次(0 或 1)。
* 常見的貪婪策略有:
1. 選擇價值最高的物品。
2. 選擇重量最輕的物品。
3. 選擇單位重量價值最高的物品。
* 這些貪婪策略都無法保證找到 0-1 背包問題的最優解。例如,對於單位重量價值最高的策略,可能因為重量太大而無法放入背包,或者選擇了總價值不如其他組合的物品。
* 0-1 背包問題是一個典型的動態規劃問題,其最優解通常通過建構一個表格來求解,時間複雜度為 ,其中 是物品數量, 是背包容量。
* 反例:背包容量 。物品 A:重量=10, 價值=100;物品 B:重量=6, 價值=70;物品 C:重量=6, 價值=70。
* 單位重量價值:A=10, B=11.67, C=11.67。
* 貪婪策略(單位重量價值最高)會選擇 B 和 C (總價值 140),但這超過了容量。如果只能選一個,則 B 或 C。
* 如果選擇 A,價值為 100。
* 如果我們不按貪婪策略,而是考慮所有組合,發現選擇 B 和 C 是不可能的。如果選擇 A,價值 100。如果選擇 B,價值 70。如果選擇 C,價值 70。
* 再換個例子:背包容量 W=50。物品1:(重量=10, 價值=60),物品2:(重量=20, 價值=100),物品3:(重量=30, 價值=120)。
* 單位重量價值:物品1 = 6, 物品2 = 5, 物品3 = 4。
* 貪婪策略會先選物品1 (重量10, 價值60)。剩餘容量40。
* 再選物品2 (重量20, 價值100)。剩餘容量20。
* 無法再選物品3。總價值 = 60 + 100 = 160。
* 然而,選擇物品2 (重量20, 價值100) 和物品3 (重量30, 價值120) 是可行的,總重量 50,總價值 220。這是更優的解。
* 結論:False。
(b) In an undirected graph, we can apply the Depth-First-Search algorithm (DFS) to get tree edges and cross edges.
* 核心觀念:DFS 在圖中的邊分類(樹邊、前向邊、後向邊、橫向邊)。
* 詳解:
* 在 DFS 遍歷過程中,根據頂點的訪問狀態和它們之間的關係,邊可以被分為幾種類型:
* 樹邊 (Tree Edge):當 DFS 從頂點 遍歷到一個尚未訪問過的鄰居 時,邊 就是一條樹邊。這些邊構成了 DFS 樹。
* 後向邊 (Back Edge):當 DFS 從頂點 遍歷到一個鄰居 ,且 已經被訪問過,並且 是 在 DFS 樹中的一個祖先(包括 的父節點,但通常我們區分父節點和真正的祖先)。在無向圖中,如果 DFS 遇到一個已訪問的鄰居 且 不是 的父節點,則這條邊 形成了一個環,這條邊可以被視為一種「後向邊」。
* 前向邊 (Forward Edge):從 DFS 樹中的一個節點 指向其 DFS 樹中的某個後代節點 的邊。
* 橫向邊 (Cross Edge):連接 DFS 樹中兩個不具有祖孫關係的節點的邊。
* 在無向圖中:
* DFS 產生的邊可以分為:
* 樹邊 (Tree Edge):當 DFS 從 到達未訪問的 時。
* 後向邊 (Back Edge):當 DFS 從 到達一個已訪問但不是 的父節點的鄰居 時。在無向圖中,任何一條非樹邊必然是後向邊(因為如果 是非樹邊,且 先於 被訪問,則 DFS 在訪問 時會發現 已被訪問,形成後向邊;如果 先於 被訪問,則 DFS 在訪問 時會發現 已被訪問,形成後向邊)。
* 橫向邊 (Cross Edge) 在無向圖的 DFS 中不存在。這是因為如果存在一條連接兩個不同分支的邊 ,假設 先被訪問,那麼 DFS 會從 訪問 (如果 未訪問),形成樹邊;或者 已經被訪問,並且 是 的祖先(形成後向邊),或者 已經被完全訪問過,且 不是 的祖先。然而,在無向圖中,如果 已經被訪問過(無論是 VISITING 還是 VISITED 狀態),並且 不是 的父節點,那麼這條邊 就會被 DFS 在遍歷 時發現,並將 視為一個已訪問的節點。如果 處於 VISITING 狀態,則為後向邊。如果 處於 VISITED 狀態,這意味著 所在的 DFS 樹分支已經完成,並且 DFS 在遍歷 時發現了這條邊。在無向圖中,這種情況下 必定是 的祖先(如果 比 先訪問),或者 已經被完全訪問過。如果 是 的祖先,則為後向邊。如果 已經被完全訪問,並且 不是 的祖先,這在無向圖的 DFS 中是不會發生的,因為如果 在 的 DFS 樹之外,DFS 會在某個時候訪問到 的連通分量,並將其標記為 VISITED。如果在 DFS 過程中,我們從 遇到一個已訪問的 (且 不是父節點),那麼 必定是 的祖先,這就是後向邊。
第 7 題10 分
Use Master theorem to solve the recurrence T(n) = T(2n/3) + 1.
登入後即可作答並保存紀錄。
這題考驗對主定理 (Master Theorem) 的應用。主定理用於分析遞迴關係式為 形式的遞迴演算法的時間複雜度。
主定理的條件:
給定遞迴關係式 ,其中 , 是常數,且 是一個漸進正函數。我們比較 與 。有三種情況:
- 情況 1:如果 對於某個常數 ,則 。
- 情況 2:如果 對於某個常數 ,則 。
- 情況 3:如果 對於某個常數 ,並且對於足夠大的 ,滿足 對於某個常數 (稱為規則性條件),則 。
分析給定的遞迴關係式:
-
確定參數:
- (遞迴調用的次數)
- (輸入規模的縮小因子,因為 )
- (除了遞迴調用之外的工作)
-
計算 :
- 。
- 所以,。
-
比較 和 :
- 我們發現 和 是相同的。
-
選擇主定理的情況:
- 情況 1 不適用,因為 不是 的 。
- 情況 3 不適用,因為 不是 的 。
- 情況 2 適用。我們需要檢查 是否是 的形式。
- 所以,。這符合情況 2 的形式,其中 。
-
應用情況 2 的結論:
- 根據主定理情況 2,當 時, 。
- 在這裡,, , 。
- 因此,。
驗證規則性條件(情況 3 的要求,但這裡適用情況 2):
雖然我們適用情況 2,但主定理的嚴格形式要求我們檢查情況 3 的規則性條件。
- 我們需要檢查 ,即 。
- 我們可以選擇 (或任何 )。如果 ,則 ,條件滿足。
- 然而,情況 2 的規則性條件是 對於 。
第 8 題10 分
Write the breadth first spanning tree starting at node 0 (visit the smaller number first).
0)
4
1
2
(7
5
6
3
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
廣度優先搜尋(Breadth-First Search, BFS)從起點開始,依距離分層拜訪:
- 第 層:起點
- 第 層:與 相鄰的節點
- 第 層:由第 層首次發現的節點
- 依此類推
每個節點「第一次被發現」時,便將目前節點與它連成 spanning tree 的樹邊。題目要求較小編號優先,因此掃描鄰接節點時依編號遞增排列。
解題方法
由圖可讀得與本題相關的鄰接關係:
依 BFS 佇列順序處理:
-
從 開始,依序發現 ,加入樹邊
-
處理節點 ,沒有新的未拜訪節點。
-
處理節點 ,依小編號優先發現 ,加入樹邊
-
處理節點 時,節點 已經被節點 發現,因此不再新增樹邊。
-
處理節點 時發現節點 ,加入樹邊
因此各層與父節點如下:
| 層級 | 節點 | BFS 父節點 |
|---|---|---|
| 第 0 層 | — | |
| 第 1 層 | ||
| 第 2 層 | ||
| 第 3 層 |