108 年 國立陽明交通大學資訊工程學系碩士班《資料結構與演算法》
第 1 題5 分
What are the outputs of the following codes?
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
int main() {
queue<int> que;
stack<int> stk;
que.push(13); que.push(2); que.push(5); que.push(27);
stk.push(2); stk.push(32); stk.push(17); stk.push(63);
cout << que.front() << ", " << que.back() << ", " << stk.top() << endl;
return 0;
}
(A) 13, 27, 63
(B) 13, 27, 2
(C) 27, 13, 2
(D) 27, 13, 63
(E) 13, 2, 63
登入後即可作答並保存紀錄。
核心觀念
本題考資料結構的存取規則:
- **佇列(queue)**遵循先進先出(FIFO)。
front()取得最早放入、尚未取出的元素;back()取得最後放入的元素。 - **堆疊(stack)**遵循後進先出(LIFO)。
top()取得最後放入、尚未取出的元素。
push() 只會加入元素,不會改變既有元素的順序,也不會移除元素。
解題方法
依序列出各元素放入容器後的狀態:
佇列:13(front)→ 2 → 5 → 27(back)
堆疊:底部 2 → 32 → 17 → 63(top)
因此:
que.front()的值是13。que.back()的值是27。stk.top()的值是63。
程式輸出為:
13, 27, 63
選項分析
第 2 題5 分
Let be the first node of a linked list , and let be a null pointer. Let be a node in , and let and be the pointers to the previous and next nodes of on , respectively. What is the function of the following pseudocode?
If :
- Then
- Else
If :
- Then
(A) Inserting a node right in front of .
(B) Inserting a node right in back of .
(C) Deleting .
(D) Swapping and the node right in front of .
(E) Swapping and the node right in back of .
登入後即可作答並保存紀錄。
核心觀念
雙向鏈結串列的每個節點都有兩個指標: 指向前一個節點, 指向下一個節點。要刪除節點 ,只需讓 的前後節點彼此相連;若 位於串列開頭,則更新串列的首節點指標 。
解題方法
依序檢查 的前後節點:
- 若 有前一個節點,令該節點的 指標跳過 ,直接指向 的下一個節點。
- 若 沒有前一個節點,表示 是首節點,將 更新為 的下一個節點。
- 若 有下一個節點,令該節點的 指標跳過 ,直接指向 的前一個節點。
因此, 被從鏈結串列中移除。整個操作只修改固定數量的指標,時間複雜度為 ,額外空間複雜度為 。
選項分析
第 3 題5 分
What descriptions of the heap are true? You will get the score only if your answer is completely correct.
(A) The time complexity of heap sort is .
(B) Heap sort is faster than quick sort in the worst case.
(C) If a binary heap is implemented by using an array, node is at the th position of the array. In addition, the right child of node is at the th position.
(D) In a maximum heap, a parent node is smaller than its children.
(E) If there are nodes in a heap, the height of the heap is .
登入後即可作答並保存紀錄。
核心觀念
二元堆積(binary heap)是一種完全二元樹,並符合堆積序性質:
- 最大堆積:每個父節點的鍵值都大於或等於子節點。
- 最小堆積:每個父節點的鍵值都小於或等於子節點。
完全二元樹的節點由上而下、由左而右填入,因此常以陣列儲存。採用從 開始的索引時,節點 的左子節點索引為 ,右子節點索引為 。
含有 個節點的堆積高度為 。堆積排序的建堆時間為 ,接著進行 次取出最大值與調整堆積,每次調整至多花費 ,所以總時間為 。
解題方法
逐一檢查各選項所述是否符合堆積的定義、陣列索引規則,以及排序演算法的最壞情況時間複雜度。複選題必須選出所有正確敘述。
選項分析
(A) 正確。
堆積排序的建堆時間為 ,排序階段需處理 個節點,每次調整堆積最多沿樹高移動,耗時 。因此總時間為:
第 4 題5 分
Without considering compiler optimization strategies, if the first and the second outputs of the following codes are 0x7ffd9e21bc00 and 0x7ffd9e21bc04, respectively, what will be the third output?
#include <iostream>
using namespace std;
int main() {
int x[5][5];
cout << &x[0][0] << " " << &x[0][1] << " " << &x[3][2] << endl;
return 0;
}
(A) 0x7ffd9e21bc48
(B) 0x7ffd9e21bc44
(C) 0x7ffd9e21bc64
(D) 0x7ffd9e21bc30
(E) 0x7ffd9e21bc68
登入後即可作答並保存紀錄。
核心觀念
C/C++ 的二維陣列以列優先(row-major)連續儲存。宣告 int x[R][C] 時,每個 int 佔 bytes:
解題方法
題目給的前兩個輸出 0x7ffd9e21bc00、0x7ffd9e21bc04 相差 ,印證每個元素 bytes。
陣列為 int x[5][5],每列 個元素,x[3][2] 前面共有
個元素,位移 bytes:
選項分析
第 5 題5 分
Suppose that the binary max heap below is implemented by using an array. When the root is removed from the heap, the system will update the heap structure immediately to maintain its property. After that, what will be the th number in the array? Note that the root is the first number.
🖼️【此處有附圖,見下方】
(A) 9
(B) 8
(C) 5
(D) 3
(E) 4
登入後即可作答並保存紀錄。
核心觀念
最大堆積(Max Heap)具有兩個性質:
- 結構上是完全二元樹,陣列依照「由上而下、同層由左到右」的順序儲存。
- 每個父節點的值都不小於其子節點。
刪除根節點時,先將最後一個節點移到根節點,再向下調整:每次與較大的子節點比較,若父節點較小就交換,直到符合最大堆積性質。
解題方法
圖中的堆積由上而下依序為:根節點 ;第二層 ;第三層 ;第四層 。其中 是 的子節點, 是 的左子節點,因此原始陣列為:
-
刪除根節點 ,將最後的 移到根節點。
移除陣列最後一格後,得到:
-
將 與兩個子節點 中較大的 交換。
因為 ,交換後為:
-
將 與目前的子節點 中較大的 交換。
因為 ,交換後為:
Consider the following graph. Please answer the following questions.
🖼️【此處有附圖,請對照原卷】
第 6-(1) 題
What is the cost of the minimum cost spanning tree of the graph?
(A) 27
(B) 21
(C) 25
(D) 20
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
最小成本生成樹(MST)要連通圖中的所有頂點,且不能形成環。若圖有 個頂點,生成樹恰有 條邊。Kruskal 演算法將邊依權重由小到大檢查,只加入不會形成環的邊。
解題方法
圖中有 七個頂點,邊與權重為:、、、、、、、、。
依 Kruskal 演算法由小到大選邊:
- 加入 、、、,目前沒有形成環。
- 加入 ,將頂點 接入。
- 會形成環,因為 與 已經透過 相連,因此略過。
第 6-(2) 題
When Kruskal’s algorithm is used, what is the weight of the last edge to be added into the minimum cost spanning tree of the above graph?
(A) 6
(B) 7
(C) 8
(D) 9
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
Kruskal 演算法將邊依權重由小到大考慮;若加入某條邊不會形成環,就將它加入最小生成樹。含有 個頂點的生成樹共有 條邊,因此本圖 7 個頂點要選出 6 條邊。
解題方法
圖中的頂點為 ,邊與權重為:、、、、、、、、。
依權重由小到大檢查:
- 加入 、、、、,這些邊都不形成環。
- 會連接已經相通的 與 ,形成環,跳過。
- 也會形成環,跳過。
第 6-(3) 題
When Prim’s algorithm is used and starts from node , what is the weight of the last edge to be added into the minimum cost spanning tree of the above graph?
(A) 5
(B) 6
(C) 7
(D) 8
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
Prim 演算法從指定起點開始,每一步都在「已納入樹的頂點」與「尚未納入的頂點」之間,選擇權重最小的邊加入。重複此步驟,直到所有頂點都納入最小生成樹;若圖有 個頂點,生成樹會有 條邊。
解題方法
圖中有 七個頂點,邊的權重為:、、、、、、、、。從 開始,逐步選取連接樹內與樹外頂點的最小權重邊:
- 樹內只有 :比較 、,選 。
- 樹內為 :可選邊中最小的是 。
- 樹內為 :可選邊中最小的是 。
- 樹內為 :可選邊中最小的是 。
- 樹內為 :可選邊中最小的是 。
Consider inserting the following numbers into an empty AVL tree:
第 7-(1) 題
What is the number in the leftmost node of the resultant AVL tree?
(A) 5
(B) 10
(C) 20
(D) 25
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
AVL 樹是符合二元搜尋樹次序的自我平衡二元樹。每個節點的平衡因子定義為:
每次插入後,若某節點的平衡因子變成 或 ,就要依失衡方向進行旋轉,使各節點的平衡因子回到 。
解題方法
依序插入題目中的數字。插入 時,節點 發生左左失衡,右旋後,相關子樹為:
10
/ \
5 20
接著插入 ,節點 發生左右失衡,先對其左子節點左旋,再對節點 右旋。插入 後,節點 發生右右失衡,對節點 左旋。此時根節點 發生左右失衡,再先左旋其左子節點,後對 右旋。
最後的 AVL 樹為:
第 7-(2) 題
What is the number in the root node of the resultant AVL tree?
(A) 20
(B) 25
(C) 40
(D) 30
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
AVL 樹是符合二元搜尋樹順序,且每個節點左右子樹高度差最多為 的二元搜尋樹。定義平衡因子為:
插入新值時,先依二元搜尋樹規則找到位置,再由插入處向上檢查平衡因子。若某節點的平衡因子變成 或 ,便依失衡方向進行旋轉。
解題方法
依序插入題目中的數字。下表列出每次插入後造成的旋轉,以及旋轉後的根節點:
| 插入值 | 造成的失衡與處理 | 旋轉後的根 |
|---|---|---|
| 在 的右子樹之右側,屬於 RR 型;對 左旋 | ||
| 尚未失衡 | ||
| 節點 發生 RR 型失衡;對 左旋 | ||
| 節點 發生 RR 型失衡;對 左旋 | ||
| 尚未失衡 | ||
| 節點 發生 LL 型失衡;對 右旋 | ||
| 節點 發生 LR 型失衡;先對其左子節點左旋,再對 右旋 | ||
| 根節點 發生 LR 型失衡;先對其左子節點左旋,再對 右旋 |
關鍵在最後一次插入。插入 後,從根節點 往下的搜尋路徑是:
第 7-(3) 題
There are four types of rotations in an AVL tree. What are the last two rotations performed during insertion of these numbers?
(A) RR, RR
(B) LL, LL
(C) RL, LR
(D) LR, RL
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
AVL 樹要求每個節點左右子樹高度差至多為 。插入後沿路徑往上找第一個失衡節點,依新節點落在它的哪一側決定修復類型:
- LL:左子的左側 → 右旋一次。
- RR:右子的右側 → 左旋一次。
- LR:左子的右側 → 先左旋左子、再右旋失衡點(一次雙旋修復)。
- RL:右子的左側 → 先右旋右子、再左旋失衡點。
解題方法
逐一插入並記錄每次修復:
| 插入 | 失衡點 | 類型 | 修復後(以括號表示 左, 右 子樹) |
|---|---|---|---|
| RR | |||
| — | — | ||
| RR | |||
| RR | |||
| — | — | 的左子為 | |
| LL | |||
| LR | |||
| LR |
關鍵兩步:
Consider inserting the following numbers into an empty B-tree of order 3:
第 8-(1) 題
What is the sum of the numbers in the rightmost node of the resultant B-tree?
(A) 120
(B) 130
(C) 110
(D) 115
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
採用常見的 B-tree 階數定義:order 3 表示每個節點最多有 3 個子節點,因此最多存 2 個鍵值。插入後若節點出現 3 個鍵值,就將中間鍵值提升至父節點,左右鍵值分別留在分裂後的兩個節點。
解題方法
依序插入,並在節點超出容量時分裂:
- 插入 後,根節點成為 ,分裂並提升中間值 ,形成根節點 ,左右子節點為 、。
- 插入 後,最右側葉節點分裂並提升 。此時根節點為 ,葉節點依序為 、、。
- 插入 後,最左側葉節點成為 ,分裂並提升 。原根節點因此成為 ,也超出容量;再將中間值 提升,形成新根節點 。
- 插入 至鍵值範圍 與 之間的葉節點;插入 至鍵值範圍 與 之間的葉節點。
最後的 B-tree 為:
第 8-(2) 題
What is the sum of the numbers in the root node of the resultant B-tree?
(A) 25
(B) 40
(C) 30
(D) 55
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
B-tree 的「階數」為 3,表示每個節點最多有 3 個子節點,因此最多存放 2 個鍵值。節點插入新鍵值後若超過 2 個,便將鍵值排序,取中間鍵值升到父節點,左右兩側的鍵值分別形成兩個節點。若根節點也溢位,則建立新根節點。
解題方法
依序插入題目中的數字,追蹤根節點及會發生溢位的節點:
- 插入 ,根節點為 。
- 插入 後,根節點溢位。將中間鍵值 升為根,得到根節點 ,左右子節點為 、。
- 插入 後,右側節點 溢位,將 升至根,得到根節點 ,子節點依序為 、、。
- 插入 ,右側子節點成為 。再插入 ,左側節點形成 ,溢位後將 升至根。此時根節點也溢位,鍵值為 ;將中間鍵值 升為新根。
- 新根為 。
第 8-(3) 題
How many node split operations are performed during insertion of these numbers?
(A) 3
(B) 2
(C) 5
(D) 4
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
依常見定義,B-tree 的「order 3」表示每個節點最多有 個子節點,因此最多可存 個鍵值。插入後若節點含有 個鍵值,就必須分裂:將中間鍵值提升至父節點,左右兩側鍵值分別留在新節點中。
若父節點因接收提升的鍵值而超出容量,也要再分裂;每分裂一個節點,就計為一次 node split operation。
解題方法
依序插入題目給的數字,記錄節點何時累積到 個鍵值而分裂:
-
插入 後,根節點為 。
-
插入 後,根節點成為 ,分裂並提升中間鍵值 。分裂次數:。
樹為根節點 ,左右子節點分別為 、。
-
插入 時,右側葉節點由 增至 ,因此分裂並提升 至根節點。分裂次數:。
根節點變為 ,葉節點為 、、。
-
插入 ,右側葉節點成為 ,未超出容量。插入 ,左側葉節點成為 ,也未超出容量。
Consider the following C program:
#include <stdbool.h>
#define N 8
#define START 4
int l[N][N] = {
{0, 1000, 1000, 1000, 1000, 1000, 1000, 1000},
{8, 0, 1000, 1000, 1000, 1000, 1000, 1000},
{10, 2, 0, 1000, 1000, 1000, 1000, 1000},
{1000, 1000, 4, 0, 1000, 1000, 1000, 1000},
{1000, 1000, 1000, 12, 0, 2, 1000, 1000},
{1000, 1000, 1000, 10, 1000, 0, 6, 8},
{1000, 1000, 1000, 1000, 1000, 1000, 0, 10},
{4, 1000, 1000, 1000, 1000, 1000, 1000, 1000}
};
bool s[N];
int d[N];
int main(void) {
int v = START;
for (int i = 0; i < N; i++) {
s[i] = false;
d[i] = l[v][i];
}
s[v] = true;
d[v] = 0;
for (int i = 0; i < N - 2; i++) {
int u_max = 2000;
int u;
for (int j = 0; j < N; j++) {
if (s[j] == false && d[j] < u_max) {
u = j;
u_max = d[j];
}
}
s[u] = true;
for (int w = 0; w < N; w++) {
if (!s[w] && d[u] + l[u][w] < d[w])
d[w] = d[u] + l[u][w];
}
}
}
第 9-(1) 題
What is the value of the smallest element in array ?
(A) 2
(B) 4
(C) 6
(D) 8
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
這段程式使用 Dijkstra 單源最短路徑演算法,從頂點 START = 4 出發,計算起點到各頂點的目前最短距離,並將結果存入陣列 d。
d[v]:目前已知從起點到頂點 的最短距離。s[v]:頂點 是否已確定最短距離。1000:代表沒有直接邊,可視為很大的距離。- 鬆弛:若經由頂點 到達 比目前距離更短,就更新 :
程式將起點的距離設為 ,因此 。
解題方法
起點為頂點 。初始化時,程式從矩陣第 列讀入各頂點的直接距離,並將起點標記為已確定:
每次迴圈從尚未確定的頂點中,選出 d 最小者,再依該頂點的出邊進行鬆弛。依序執行如下:
| 步驟 | 選出的頂點 | 距離更新 |
|---|---|---|
| 1 | 5 | 經由 更新:、 |
| 2 | 6 | 經由 到 的距離為 ,不小於目前的 |
| 3 | 7 | 經由 更新: |
| 4 | 3 | 經由 更新: |
| 5 | 0 | 沒有更短的距離更新 |
| 6 | 2 | 經由 更新: |
迴圈結束時:
第 9-(2) 題
What is the value of the largest element in array ?
(A) 6
(B) 12
(C) 18
(D) 24
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
這段程式使用 Dijkstra 最短路徑演算法,從起點 START = 4 計算到各頂點的最短距離。
s[j] 表示頂點 是否已確定最短距離;d[j] 表示目前從起點到頂點 的最短距離估計。每輪選出尚未確定、且 d 值最小的頂點 ,再用
更新其他頂點。矩陣中的 1000 代表沒有直接連線。
解題方法
起點是頂點 。初始化後:
接著依照每輪選出的最小距離頂點進行鬆弛:
| 選出的頂點 | 鬆弛後的更新 | |
|---|---|---|
| 到 的距離為 ,不優於目前的 | ||
| 到 的候選距離為 ,不優於目前的 |
第 9-(3) 題
What is the time complexity of the above program?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
這段程式使用鄰接矩陣表示加權圖,並以類似 Dijkstra 演算法的方式反覆選出目前距離最小、尚未處理的頂點,再更新其他頂點的暫定距離。
時間複雜度要看程式實際執行的迴圈次數,以及每次迴圈內的工作量;不必先判斷演算法是否完整求出所有最短路徑。
解題方法
初始化時,第一個 for 迴圈執行 次,每次設定一個 s[i] 與 d[i],耗時為 。
主要迴圈執行 次,因此迴圈次數為 。每次迴圈包含:
- 透過
j迴圈掃描全部 個頂點,找出距離最小的未處理頂點,耗時 。 - 透過
w迴圈掃描全部 個頂點,嘗試更新距離,耗時 。
所以每次主要迴圈耗時為 ,總耗時為:
Let be an array of integers. Consider the following algorithms.
Algorithm 1:
- ;
- Exchange with .
- .
- .
- For to :
- If , then:
- .
- Exchange with .
- If , then:
- Exchange with .
- Return .
Algorithm 2:
- If , then:
- Repeat:
- .
- Until the larger part is at most of the subarray .
- .
- .
- Repeat:
第 10-(1) 題
Algorithm has running time ____ in the average case (as close as possible).
(A)
(B)
(C)
(D)
(E)
登入後即可作答並保存紀錄。
核心觀念
這題考的是隨機快速排序的平均時間,以及「重複分割直到切分夠平衡」對遞迴深度的影響。
令目前子陣列長度為 。一次呼叫 會掃描整個子陣列,因此耗時為 。若每次分割都能讓較大的子問題至多為原問題的 ,遞迴就會維持平衡,深度為 。
解題方法
先看一次分割成功的機率。假設元素互異,隨機選取的樞紐元素,其排序名次均勻分布。若樞紐左側有 個元素,左右子問題大小分別為 與 。符合接受條件的樞紐名次,約落在中間三分之一,因此一次分割成功的機率是常數;當 增大時,此機率約為 。
所以重複分割直到成功所需的嘗試次數,期望為常數。每次嘗試耗時 ,故該節點的期望分割成本仍為 。
成功後,較大的子問題至多為原問題的 ;另一個子問題也不能太小,因為兩邊大小總和為 。因此遞迴深度為 。每一層處理的子陣列長度總和為 ,總時間為
第 10-(2) 題
What is the probability that the repeat loop (lines 2–4) of Algorithm is executed exactly once?
(A)
(B)
(C)
(D)
(E)
登入後即可作答並保存紀錄。
核心觀念
每次呼叫 時,樞紐元素從目前子陣列中均勻隨機選出。分割後,演算法 會檢查較大的那一側是否不超過子陣列的 ;若符合,重複迴圈就停止。
解題方法
將樞紐在子陣列中的相對位置視為 到 之間的均勻隨機比例 。分割後兩側的比例約為 與 。要讓較大的一側不超過 ,須同時滿足:
因此:
符合條件的位置占整個區間的比例為:
第 10-(3) 題
What is the average number of iterations that the repeat loop (lines 2–4) of Algorithm is executed?
(A) 2
(B) 3
(C) 4
(D) 1.5
(E) 2.5
登入後即可作答並保存紀錄。
核心觀念
這題考的是幾何分布的期望值。Q 每次執行 P 都隨機選一個樞紐,直到分割結果符合條件才停止;若每次成功機率為 ,所需執行次數的期望值為:
解題方法
設目前子陣列長度為 。要讓較大的分割部分至多占子陣列的 ,樞紐必須落在中間的 區段:左、右兩部分都不能超過 。
在標準分析中,假設元素互異、樞紐的排名等機率出現,能符合條件的樞紐約占全部樞紐的 ,因此每次 P 成功的機率為:
代入幾何分布的期望值:
此期望值包含最後一次成功的執行。
Given a sequence of positive numbers, we want to put pairs of parentheses around the numbers, such that the total sum of the intermediate sums is minimized.
For example, given four positive numbers in order , we can put three pairs of parentheses around and add them as . Three intermediate sums are generated, namely , , and . The total sum of these three intermediate sums is . If we put the parentheses differently as , the three intermediate sums generated are , , and 19$.
Consider the input: . Let the smallest intermediate sum be .
第 11-(1) 題
is ____.
(A) 1
(B) 2
(C) 3
(D) 4
(E) 5
登入後即可作答並保存紀錄。
核心觀念
每一對括號是一次「把相鄰兩段合併」的加法,產生的中間和=這兩段涵蓋的所有數字總和。數字順序不能改變,所以這是區間動態規劃(與矩陣鏈乘、石子合併同型)。
令 為第 到第 個數的總和, 為把這段加成一個數的最小中間和總和:
解題方法
輸入 ,總和 。依區間長度由短到長填表(每列由左而右是起點 的區間):
| 長度 | 值 |
|---|---|
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 |
第 11-(2) 題
The integer part of is ____.
(A) 6
(B) 7
(C) 8
(D) 9
(E) 5
登入後即可作答並保存紀錄。
核心觀念
每一對括號是一次「把相鄰兩段合併」的加法,產生的中間和=這兩段涵蓋的所有數字總和。數字順序不能改變,所以這是區間動態規劃(與矩陣鏈乘、石子合併同型)。
令 為第 到第 個數的總和, 為把這段加成一個數的最小中間和總和:
解題方法
輸入 ,總和 。依區間長度由短到長填表(每列由左而右是起點 的區間):
| 長度 | 值 |
|---|---|
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 |
第 11-(3) 題
Which statement about this question is correct?
(A) It needs exponential time to find the answer.
(B) This problem does not have an optimal substructure property.
(C) The best solution is smaller than 50.
(D) The best solution is smaller than 100.
(E) It does NOT have an -time algorithm.
登入後即可作答並保存紀錄。
核心觀念
每一對括號是一次「把相鄰兩段合併」的加法,產生的中間和=這兩段涵蓋的所有數字總和。數字順序不能改變,所以這是區間動態規劃(與矩陣鏈乘、石子合併同型)。
令 為第 到第 個數的總和, 為把這段加成一個數的最小中間和總和:
解題方法
輸入 ,總和 。依區間長度由短到長填表(每列由左而右是起點 的區間):
| 長度 | 值 |
|---|---|
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 |
例:;。
整段 依最後一次合併的切點 :
| 1 | |
| 2 | |
| 3 |
Let be a connected flow network with source , sink , and an integer capacity on each edge . Let be the maximum capacity of the edges. Consider the following proposed algorithm.
Algorithm 3:
- ;
- Initialize flow ;
- ;
- While :
- While there exists an augmenting path of capacity at least :
- Augment along .
- ;
- While there exists an augmenting path of capacity at least :
- Return .
第 12-(1) 題
Which of the following statements are true?
(A) The capacity of a minimum cut is unique.
(B) The minimum cut is not unique.
(C) The minimum cut has capacity at most .
(D) It takes time to find an augmenting path of capacity at least , if one exists.
(E) The inner while loop (lines 5–6) is executed times for each .
登入後即可作答並保存紀錄。
核心觀念
這是 容量縮放(capacity scaling) 版的 Ford–Fulkerson(CLRS 習題 26-5 的情境):門檻 從不超過 的最大 2 的冪次開始,每個階段只找殘餘容量 的增廣路徑,找不到就把 減半。三個基本事實:
- 最大流值=最小割容量(最大流最小割定理),這個數值唯一。
- 任一割最多切到 條邊、每條容量 ,所以割容量 。
- 在殘餘網路中只保留容量 的邊做 BFS/DFS,就能在 時間找到(或確定沒有)容量至少 的增廣路徑( 連通,所以 )。
選項分析
- (A) 正確。 最小割的「容量」是一個最小值,必然唯一;可能不唯一的是達到這個值的割本身。
- **(B) 錯誤。
第 12-(2) 題
The running time of the proposed algorithm is ____.
(A)
(B)
(C)
(D)
(E)
登入後即可作答並保存紀錄。
核心觀念
容量縮放(capacity scaling)的 Ford–Fulkerson:門檻 從 開始,每個階段只沿殘餘容量 的增廣路徑推流,找不到就把 減半,直到 。
解題方法
把總時間拆成三個因子相乘:
- 階段數: 從約 減半到 ,共 個階段。
- 每階段的增廣次數:上一階段(門檻 )結束時,殘餘網路中從 經容量 的邊可達的點集 形成一個割,割上每條邊的殘餘容量都 ,所以剩下還能增加的流量 。本階段每次增廣至少增加 ,因此最多 次。
- 每次增廣的成本:在只保留容量 的殘餘邊上做 BFS/DFS,(網路連通,)。
第 12-(3) 題
Which of the following statements are true?
(A) If all the edge capacities are different, then there is a unique minimum cut.
(B) If all the edge capacities are different, then there is a unique set of edge flows that gives the maximum flow value.
(C) When we cannot find an augmenting path, let be the set of and the nodes reachable from in the residual flow network. Then and form a minimum cut.
(D) Let be a minimum cut corresponding to a maximum flow of . Then all the edges from to have zero residual capacity.
(E) With integral capacity on each edge, a maximum flow may have non-integral flow on some edge(s).
登入後即可作答並保存紀錄。
核心觀念
這題考最大流與最小割定理、割的唯一性,以及整數容量對最大流的影響。
- 割:將頂點分成包含來源 的集合 與包含匯點 的集合 。割的容量是所有由 指向 的邊容量總和:
- 殘餘網路:正向邊的殘餘容量為 ;反向邊的殘餘容量反映可撤回的流量。
- 最大流最小割定理:當殘餘網路中不存在從 到 的增廣路徑時,最大流值等於某個最小割容量。由殘餘網路中從 可到達的頂點可構造出這個最小割。
- 整數容量定理:若每條邊的容量都是整數,則存在一個整數最大流;但這不代表每個最大流都必須是整數。
解題方法
逐項檢查敘述是否能由定理直接推出。涉及「唯一」的敘述,須區分「各邊容量不同」與「不同邊集合的容量總和不同」;涉及「可能」的敘述,則只要有一個符合條件的例子即可判定。
選項分析
(A) 錯誤。 各邊容量互不相同,不代表不同割的容量總和互不相同。割容量是多條邊容量的總和,而不同整數可以有相同的總和,例如 。因此,容量互異無法保證最小割唯一。
(B) 錯誤。 最大流的總值唯一,但達到該值的各邊流量配置未必唯一。不同路徑可能承載不同流量組合而得到相同的最大流值;
Given an undirected graph with , , and weights , we define an order of to be a Magic Order if, for all :
where indicates the edges between disjoint vertex subsets and .
Consider the following incomplete algorithm.
Algorithm 4:
- Set for all .
- For to :
- Choose from such that it has maximum key value (breaking ties arbitrarily).
- For :
- .
第 13-(1) 題
What is the missing part in line 5 of the above algorithm?
(A)
(B)
(C)
(D)
(E)
登入後即可作答並保存紀錄。
核心觀念
這題考的是 最大鄰接順序(Maximum Adjacency Ordering) 的鍵值維護。
在選出前 個頂點後,尚未選出的頂點 的鍵值應代表它與已選頂點集合的總連接權重:
因此,每選出一個新頂點 ,所有尚未選出的頂點 都要把「與 之間的邊權重」加進 。
解題方法
一開始尚未選出任何頂點,所以所有 設為 。選出 後,鍵值的變化只來自新加入已選集合的 ,故更新量是:
這樣每次更新後, 仍等於 與目前已選頂點集合之間的總邊權重。每輪挑選鍵值最大的未選頂點,就符合題目 Magic Order 的定義。
選項分析
第 13-(2) 題
Which of the following statements are true?
(A) It takes time for line 3, if it is implemented with an array.
(B) If we use a binary heap, then the cost of line 3 is .
(C) If we use a Fibonacci heap, then the amortized cost of line 3 is .
(D) If we use a Fibonacci heap, then line 5 has amortized cost .
(E) If we use a binary heap, then line 5 has worst-case time complexity .
登入後即可作答並保存紀錄。
核心觀念
這題考的是「最大鍵值優先佇列」中,取出最大值與更新鍵值的時間複雜度。演算法每次選出目前 key 最大的未選頂點;接著,對每個尚未選取的頂點,將它與新選頂點之間的邊權重總和加到 key 上。
因此,資料結構需要支援:
- 取出最大值:對應第 3 行選擇 。
- 增加鍵值:對應第 5 行更新
key(v)。
若採用最大堆,二元堆的增加鍵值在最壞情況下為 ;斐波那契堆的增加鍵值則為攤銷 。
解題方法
逐項將第 3 行與第 5 行對應到優先佇列操作:
- 第 3 行:從最多 個未選頂點中取出鍵值最大者。
- 第 5 行:將某個未選頂點的鍵值增加一個非負邊權重總和。
陣列取最大值時須逐一比較所有候選者,成本為 。二元最大堆取最大值需要移除堆頂並恢復堆序,成本為 。斐波那契最大堆取最大值的攤銷成本也是 。
選項分析
第 13-(3) 題
With a Fibonacci heap, the above algorithm has amortized cost ____ (pick one as close as possible).
(A)
(B)
(C)
(D)
(E)
登入後即可作答並保存紀錄。
核心觀念
每次選出頂點 後,對尚未選取的頂點 ,更新它與已選頂點集合 之間的總邊權。題目空格應填入 與 之間邊的權重總和:
若兩點間沒有邊,此值為 。因此,選取 前的 正好是 與目前已選頂點集合之間的邊權總和;每次取出最大 key 的頂點,就符合 Magic Order 的定義。
解題方法
使用最大 Fibonacci heap 儲存尚未選取的頂點,並以 作為優先值。
- 將 個頂點及其初始 key 值 放入堆中,建堆成本為 。
- 每輪取出最大 key 的頂點,共 次。Fibonacci heap 的
extract-max攤銷成本為 ,合計 。 - 處理已選頂點的鄰邊,更新尚未選取鄰點的 key。每條邊至多處理一次,共 次更新。最大 Fibonacci heap 的
increase-key攤銷成本為 ,合計 。
因此總攤銷時間為:
Let be a connected, simple, undirected graph of at least 6 nodes, and let be a BFS tree of rooted at node . Answer the following questions.
第 14-(1) 題
If is an edge in and has depth 2 in , then may have depth ____ in .
(A) 0
(B) 1
(C) 2
(D) 3
(E) 4
登入後即可作答並保存紀錄。
核心觀念
在以 為根的 BFS 樹中,節點 的深度等於圖中從 到 的最短路徑長度,記為 。
若 是圖 的一條邊,從 到 的最短路徑再接上邊 ,就得到一條從 到 、長度為 的路徑。因此:
反過來也成立,所以相鄰節點的深度差至多為 :
解題方法
已知 的深度為 ,代入相鄰節點深度差的限制:
因此 的深度只能是 、 或 。
選項分析
第 14-(2) 題
If nodes and both have depth 2 in and , then the shortest path (in terms of the number of edges) that connects and may have ____ edges.
(A) 0
(B) 1
(C) 2
(D) 3
(E) 4
登入後即可作答並保存紀錄。
核心觀念
在以 為根的 BFS 樹 中,節點的深度等於它在原圖 中到 的最短距離。若兩個節點在 中相鄰,它們的深度至多相差 。
題目中的 是不同節點,且都在深度 。沿 BFS 樹從 經共同根 到 ,路徑長度為 。因此, 到 的最短路徑至少有 條邊,至多有 條邊。
解題方法
依序判斷長度 、、、 是否都能出現。以下各例都可補足節點,使圖至少有 個節點,且不改變 、 間的最短距離。
- **長度 :**直接加入邊 ,則兩節點相鄰。
- **長度 :**令 是同一個深度 節點 的子節點,路徑為 。
- **長度 :**令 的深度 父節點分別為 ,再加入深度 節點 ,並加入邊 。如此 長度為 ,且沒有長度 或 的捷徑。
第 14-(3) 題
If node (the root of ) has degree 5 in , then may have degree ____ in .
(A) 1
(B) 2
(C) 3
(D) 4
(E) 5
登入後即可作答並保存紀錄。
核心觀念
在以 為根的廣度優先搜尋樹(BFS tree)中,樹上的每條邊都連接原圖 中相鄰的節點。BFS 會先從根節點探索距離為 的所有節點,因此 在 中的每個鄰居,都會成為 在 BFS 樹 中的子節點。
所以根節點的度數在兩張圖中相同:
解題方法
已知 。根節點的五個鄰居都與 直接相連,BFS 從 開始搜尋時,會將這五個鄰居全部列為第一層節點,並以樹邊連到 。
因此:
選項分析
The knapsack problem can be defined as follows. You may assume that it takes time to perform an arithmetic operation on a pair of integers in for some .
Input: an integer and pairs of positive integers , where and for every .
Goal: output a subset of such that
is the largest possible.
第 15-(1) 題
If , then the above knapsack problem is known to be solvable in ____ time (as best as possible).
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
這題考的是 背包的動態規劃。每件物品只能選或不選;以背包容量作為 DP 狀態,可在偽多項式時間內求得最佳價值。
解題方法
令 表示目前處理過的物品中,總重量不超過 時可取得的最大總價值。處理第 件物品時,若容量 ,更新為
容量須由大到小更新,避免同一件物品被重複使用。對每件物品最多檢查 個容量,因此時間複雜度為
題目給定 ,代入可得 。選項中以 表示這個動態規劃時間界。
題目也指定整數算術可在 時間完成,因此每次狀態轉移不必再乘上整數位數的成本。
選項分析
第 15-(2) 題
If and for every , then the above knapsack problem is known to be solvable in ____ time (as best as possible).
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
背包問題要在總重量不超過容量 的條件下,讓總價值最大。此題每件物品的重量都是 ,且每件物品的價值 都是正整數。
解題方法
由 可知,當 充分大時,。把全部 件物品放入背包,總重量為
因此所有物品都能放入背包。又因為每個 ,加入任何一件物品都會增加總價值,所以選取全部物品正是最佳解。
演算法只需讀取輸入並輸出集合 ,時間為 。輸出包含 個索引,因此至少需要 時間;故最佳漸近時間為 。
選項分析
第 15-(3) 題
If and for every , then the above knapsack problem is known to be solvable in ____ time (as best as possible).
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
背包容量限制為 ,每件物品的重量為 ,價值為 。本題所有 都是正整數,因此只要所有物品放得進背包,最佳解就是選入全部物品。
解題方法
因為每件物品的重量只可能是 或 ,所以總重量至多為
題目給定 ,表示當 充分大時, 至少為某個正的常數乘上 ,因此 。所有物品都能放入背包。又因為每件物品的價值皆為正,選入全部物品可使總價值最大。
演算法只需讀取 組物品資料,並輸出全部 件物品,時間為 。讀取輸入至少需要檢查 組資料,因此時間下界為 ;故最佳可能時間為 。
選項分析
A Hamiltonian cycle of a graph is a simple cycle that visits all the nodes in . Suppose that there is an -time algorithm that decides for any -node graph .
Input: a simple undirected graph
Output: “true,” if has a Hamiltonian cycle; “false,” otherwise.
Complete Algorithm 5, which is an -time algorithm that uses at most once to decide for any -node graph , for some distinct nodes .
Input: a simple undirected graph of and three distinct nodes .
Output: “true,” if has a Hamiltonian cycle on which are consecutive nodes in an arbitrary order; “false,” otherwise.
Algorithm 5:
- ;
- ;
- If at least two of edges are not contained in :
- Return ____.
- Else if exactly one of edges is not contained in :
- Assume without loss of generality that .
- ;
- Else:
- ;
- Return .
第 16-(1) 題
Which of the following shall be placed in the missing part of line 4?
(A) true
(B) false
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
若三個不同節點 在 Hamiltonian cycle 上連續,三者之間必須有兩條邊,形成長度為 的路徑,例如 使用 、。
因此,若 、、 中至少兩條邊不存在,三者之間最多只剩一條邊,不可能在 Hamiltonian cycle 上連續,應回傳 false。
解題方法
最直接的填法是直接回傳 false,即選項 (B)。
不過,依題目原文,選項 (D) 也會回傳 false:此時 中新增的節點 沒有連接任何邊,是孤立節點,所以 不可能有 Hamiltonian cycle。此分支會直接回傳,不會再執行第 7 行;其他分支才呼叫第 7 行的 ,所以每條執行路徑至多呼叫一次。 有 個節點,呼叫時間仍為 。
第 16-(2) 題
Which of the following shall be placed in the missing part of line 6?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
在 Hamiltonian cycle 中,每個頂點都必須恰好有兩條邊屬於該環。因此,若新增頂點 或 在圖 中的度數小於 , 就不可能有 Hamiltonian cycle。
解題方法
第 6 行位於「 三條邊都已在 中」的分支。此時新增的頂點 尚未連接任何邊,必須由第 6 行新增的邊提供足夠的連接,才有機會形成 Hamiltonian cycle。
檢查選項可知,(A)、(B)、(C) 各只讓 、 分別連上一條邊;(D) 則只加入邊 ,使 、 的度數也都只有 。因此,這四個選項都會使 不可能有 Hamiltonian cycle,無法完成題目要求的判定演算法。
選項分析
- (A) :錯誤。 、 各只有一條 incident edge,不可能位於 Hamiltonian cycle。
第 16-(3) 題
Which of the following shall be placed in the missing part of line 8?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
Hamiltonian cycle 中每個頂點都必須在環上恰好使用兩條 incident edges,因此圖中每個頂點的度數至少要是 。新增頂點 後,若其中任一頂點的度數只有 ,新圖就不可能有 Hamiltonian cycle。
解題方法
在 Else 分支中,前三條邊 都已存在。此時 初始為 ,而 只包含原圖頂點 之間的邊; 都沒有 incident edges。檢查各選項新增後, 的度數:
- (A) 加入 後, 的度數都為 。
- (B) 加入 後, 的度數都為 。
- (C) 加入 後, 的度數都為 。
- (D) 加入 後, 的度數都為 。
因此,四個選項都會使 不可能有 Hamiltonian cycle,無法正確判定原圖是否存在符合條件的環。
選項分析