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 head[L]head[L] be the first node of a linked list LL, and let NILNIL be a null pointer. Let xx be a node in LL, and let prev[y]prev[y] and next[y]next[y] be the pointers to the previous and next nodes of yy on LL, respectively. What is the function of the following pseudocode?

If prev[x]≠NILprev[x] \ne NIL:

  • Then next[prev[x]]←next[x]next[prev[x]] \leftarrow next[x]
  • Else head[L]←next[x]head[L] \leftarrow next[x]

If next[x]≠NILnext[x] \ne NIL:

  • Then prev[next[x]]←prev[x]prev[next[x]] \leftarrow prev[x]

(A) Inserting a node right in front of xx.
(B) Inserting a node right in back of xx.
(C) Deleting xx.
(D) Swapping xx and the node right in front of xx.
(E) Swapping xx and the node right in back of xx.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

雙向鏈結串列的每個節點都有兩個指標:prev[y]prev[y] 指向前一個節點,next[y]next[y] 指向下一個節點。要刪除節點 xx,只需讓 xx 的前後節點彼此相連;若 xx 位於串列開頭,則更新串列的首節點指標 head[L]head[L]。

解題方法

依序檢查 xx 的前後節點:

  • 若 xx 有前一個節點,令該節點的 nextnext 指標跳過 xx,直接指向 xx 的下一個節點。
  • 若 xx 沒有前一個節點,表示 xx 是首節點,將 head[L]head[L] 更新為 xx 的下一個節點。
  • 若 xx 有下一個節點,令該節點的 prevprev 指標跳過 xx,直接指向 xx 的前一個節點。

因此,xx 被從鏈結串列中移除。整個操作只修改固定數量的指標,時間複雜度為 O(1)O(1),額外空間複雜度為 O(1)O(1)。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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 O(nlog⁡n)O(n\log n).
(B) Heap sort is faster than quick sort in the worst case.
(C) If a binary heap is implemented by using an array, node ii is at the iith position of the array. In addition, the right child of node ii is at the (i×2)(i\times 2)th position.
(D) In a maximum heap, a parent node is smaller than its children.
(E) If there are nn nodes in a heap, the height of the heap is O(log⁡n)O(\log n).

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

二元堆積(binary heap)是一種完全二元樹,並符合堆積序性質:

  • 最大堆積:每個父節點的鍵值都大於或等於子節點。
  • 最小堆積:每個父節點的鍵值都小於或等於子節點。

完全二元樹的節點由上而下、由左而右填入,因此常以陣列儲存。採用從 11 開始的索引時,節點 ii 的左子節點索引為 2i2i,右子節點索引為 2i+12i+1。

含有 nn 個節點的堆積高度為 Θ(log⁡n)\Theta(\log n)。堆積排序的建堆時間為 O(n)O(n),接著進行 nn 次取出最大值與調整堆積,每次調整至多花費 O(log⁡n)O(\log n),所以總時間為 O(nlog⁡n)O(n\log n)。

解題方法

逐一檢查各選項所述是否符合堆積的定義、陣列索引規則,以及排序演算法的最壞情況時間複雜度。複選題必須選出所有正確敘述。

選項分析

(A) 正確。
堆積排序的建堆時間為 O(n)O(n),排序階段需處理 nn 個節點,每次調整堆積最多沿樹高移動,耗時 O(log⁡n)O(\log n)。因此總時間為:

O(n)+O(nlog⁡n)=O(nlog⁡n)O(n)+O(n\log n)=O(n\log n)
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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 佔 44 bytes:

addr⁡(x[i][j])=addr⁡(x[0][0])+(i×C+j)×4\operatorname{addr}(x[i][j])=\operatorname{addr}(x[0][0])+(i\times C+j)\times 4

解題方法

題目給的前兩個輸出 0x7ffd9e21bc00、0x7ffd9e21bc04 相差 44,印證每個元素 44 bytes。

陣列為 int x[5][5],每列 C=5C=5 個元素,x[3][2] 前面共有

3×5+2=173\times5+2=17

個元素,位移 17×4=68=0x4417\times4=68=\texttt{0x44} bytes:

0x7ffd9e21bc00+0x44=0x7ffd9e21bc44\texttt{0x7ffd9e21bc00}+\texttt{0x44}=\texttt{0x7ffd9e21bc44}

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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 44th number in the array? Note that the root is the first number.

🖼️【此處有附圖,見下方】

(A) 9
(B) 8
(C) 5
(D) 3
(E) 4

🖼️ 本題附圖:
第 5 題附圖

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

最大堆積(Max Heap)具有兩個性質:

  • 結構上是完全二元樹,陣列依照「由上而下、同層由左到右」的順序儲存。
  • 每個父節點的值都不小於其子節點。

刪除根節點時,先將最後一個節點移到根節點,再向下調整:每次與較大的子節點比較,若父節點較小就交換,直到符合最大堆積性質。

解題方法

圖中的堆積由上而下依序為:根節點 1414;第二層 10,910,9;第三層 8,5,7,68,5,7,6;第四層 3,2,43,2,4。其中 3,23,2 是 88 的子節點,44 是 55 的左子節點,因此原始陣列為:

[14,10,9,8,5,7,6,3,2,4][14,10,9,8,5,7,6,3,2,4]
  1. 刪除根節點 1414,將最後的 44 移到根節點。

    移除陣列最後一格後,得到:

    [4,10,9,8,5,7,6,3,2][4,10,9,8,5,7,6,3,2]
  2. 將 44 與兩個子節點 10,910,9 中較大的 1010 交換。

    因為 4<104<10,交換後為:

    [10,4,9,8,5,7,6,3,2][10,4,9,8,5,7,6,3,2]
  3. 將 44 與目前的子節點 8,58,5 中較大的 88 交換。

    因為 4<84<8,交換後為:

    [10,8,9,4,5,7,6,3,2][10,8,9,4,5,7,6,3,2]
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

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

🖼️ 本題附圖:
第 6-(1) 題附圖

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

最小成本生成樹(MST)要連通圖中的所有頂點,且不能形成環。若圖有 nn 個頂點,生成樹恰有 n−1n-1 條邊。Kruskal 演算法將邊依權重由小到大檢查,只加入不會形成環的邊。

解題方法

圖中有 A,B,C,D,E,F,GA,B,C,D,E,F,G 七個頂點,邊與權重為:AB=1AB=1、AG=2AG=2、GE=3GE=3、ED=4ED=4、GC=5GC=5、CD=6CD=6、BC=7BC=7、AF=8AF=8、FE=9FE=9。

依 Kruskal 演算法由小到大選邊:

  • 加入 ABAB、AGAG、GEGE、EDED,目前沒有形成環。
  • 加入 GCGC,將頂點 CC 接入。
  • CD=6CD=6 會形成環,因為 CC 與 DD 已經透過 C−G−E−DC-G-E-D 相連,因此略過。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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

🖼️ 本題附圖:
第 6-(2) 題附圖

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Kruskal 演算法將邊依權重由小到大考慮;若加入某條邊不會形成環,就將它加入最小生成樹。含有 nn 個頂點的生成樹共有 n−1n-1 條邊,因此本圖 7 個頂點要選出 6 條邊。

解題方法

圖中的頂點為 A,B,C,D,E,F,GA,B,C,D,E,F,G,邊與權重為:AB=1AB=1、AG=2AG=2、GE=3GE=3、ED=4ED=4、GC=5GC=5、CD=6CD=6、BC=7BC=7、AF=8AF=8、FE=9FE=9。

依權重由小到大檢查:

  • 加入 AB(1)AB(1)、AG(2)AG(2)、GE(3)GE(3)、ED(4)ED(4)、GC(5)GC(5),這些邊都不形成環。
  • CD(6)CD(6) 會連接已經相通的 CC 與 DD,形成環,跳過。
  • BC(7)BC(7) 也會形成環,跳過。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 6-(3) 題

When Prim’s algorithm is used and starts from node FF, 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

🖼️ 本題附圖:
第 6-(3) 題附圖

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Prim 演算法從指定起點開始,每一步都在「已納入樹的頂點」與「尚未納入的頂點」之間,選擇權重最小的邊加入。重複此步驟,直到所有頂點都納入最小生成樹;若圖有 nn 個頂點,生成樹會有 n−1n-1 條邊。

解題方法

圖中有 A,B,C,D,E,F,GA,B,C,D,E,F,G 七個頂點,邊的權重為:AB=1AB=1、AG=2AG=2、GE=3GE=3、ED=4ED=4、GC=5GC=5、CD=6CD=6、BC=7BC=7、AF=8AF=8、FE=9FE=9。從 FF 開始,逐步選取連接樹內與樹外頂點的最小權重邊:

  1. 樹內只有 FF:比較 FA=8FA=8、FE=9FE=9,選 FAFA。
  2. 樹內為 {F,A}\{F,A\}:可選邊中最小的是 AB=1AB=1。
  3. 樹內為 {F,A,B}\{F,A,B\}:可選邊中最小的是 AG=2AG=2。
  4. 樹內為 {F,A,B,G}\{F,A,B,G\}:可選邊中最小的是 GE=3GE=3。
  5. 樹內為 {F,A,B,G,E}\{F,A,B,G,E\}:可選邊中最小的是 ED=4ED=4。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Consider inserting the following numbers into an empty AVL tree:

20, 30, 40, 50, 60, 70, 10, 5, 25, 4520,\ 30,\ 40,\ 50,\ 60,\ 70,\ 10,\ 5,\ 25,\ 45

第 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 樹是符合二元搜尋樹次序的自我平衡二元樹。每個節點的平衡因子定義為:

BF(v)=h(vleft)−h(vright)\mathrm{BF}(v)=h(v_{\text{left}})-h(v_{\text{right}})

每次插入後,若某節點的平衡因子變成 +2+2 或 −2-2,就要依失衡方向進行旋轉,使各節點的平衡因子回到 −1、0、+1-1、0、+1。

解題方法

依序插入題目中的數字。插入 55 時,節點 2020 發生左左失衡,右旋後,相關子樹為:

    10
   /  \
  5   20

接著插入 2525,節點 3030 發生左右失衡,先對其左子節點左旋,再對節點 3030 右旋。插入 4545 後,節點 3030 發生右右失衡,對節點 3030 左旋。此時根節點 5050 發生左右失衡,再先左旋其左子節點,後對 5050 右旋。

最後的 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 樹是符合二元搜尋樹順序,且每個節點左右子樹高度差最多為 11 的二元搜尋樹。定義平衡因子為:

BF(v)=h(左子樹)−h(右子樹)BF(v)=h(\text{左子樹})-h(\text{右子樹})

插入新值時,先依二元搜尋樹規則找到位置,再由插入處向上檢查平衡因子。若某節點的平衡因子變成 22 或 −2-2,便依失衡方向進行旋轉。

解題方法

依序插入題目中的數字。下表列出每次插入後造成的旋轉,以及旋轉後的根節點:

插入值造成的失衡與處理旋轉後的根
20,30,4020,30,40在 2020 的右子樹之右側,屬於 RR 型;對 2020 左旋3030
5050尚未失衡3030
6060節點 4040 發生 RR 型失衡;對 4040 左旋3030
7070節點 3030 發生 RR 型失衡;對 3030 左旋5050
1010尚未失衡5050
55節點 2020 發生 LL 型失衡;對 2020 右旋5050
2525節點 3030 發生 LR 型失衡;先對其左子節點左旋,再對 3030 右旋5050
4545根節點 5050 發生 LR 型失衡;先對其左子節點左旋,再對 5050 右旋3030

關鍵在最後一次插入。插入 4545 後,從根節點 5050 往下的搜尋路徑是:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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 樹要求每個節點左右子樹高度差至多為 11。插入後沿路徑往上找第一個失衡節點,依新節點落在它的哪一側決定修復類型:

  • LL:左子的左側 → 右旋一次。
  • RR:右子的右側 → 左旋一次。
  • LR:左子的右側 → 先左旋左子、再右旋失衡點(一次雙旋修復)。
  • RL:右子的左側 → 先右旋右子、再左旋失衡點。

解題方法

逐一插入並記錄每次修復:

插入失衡點類型修復後(以括號表示 左, 右 子樹)
20,30,4020,30,402020RR30(20,40)30(20,40)
5050——30(20,40( ,50))30(20,40(\,,50))
60604040RR30(20,50(40,60))30(20,50(40,60))
70703030RR50(30(20,40),60( ,70))50(30(20,40),60(\,,70))
1010——2020 的左子為 1010
552020LL50(30(10(5,20),40),60( ,70))50(30(10(5,20),40),60(\,,70))
25253030LR50(20(10(5),30(25,40)),60( ,70))50(20(10(5),30(25,40)),60(\,,70))
45455050LR30(20(10(5),25),50(40( ,45),60( ,70)))30(20(10(5),25),50(40(\,,45),60(\,,70)))

關鍵兩步:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Consider inserting the following numbers into an empty B-tree of order 3:

20, 30, 40, 50, 60, 70, 10, 5, 25, 4520,\ 30,\ 40,\ 50,\ 60,\ 70,\ 10,\ 5,\ 25,\ 45

第 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 個鍵值,就將中間鍵值提升至父節點,左右鍵值分別留在分裂後的兩個節點。

解題方法

依序插入,並在節點超出容量時分裂:

  1. 插入 20,30,4020,30,40 後,根節點成為 [20,30,40][20,30,40],分裂並提升中間值 3030,形成根節點 [30][30],左右子節點為 [20][20]、[40][40]。
  2. 插入 50,60,7050,60,70 後,最右側葉節點分裂並提升 5050。此時根節點為 [30,50][30,50],葉節點依序為 [20][20]、[40][40]、[60,70][60,70]。
  3. 插入 10,510,5 後,最左側葉節點成為 [5,10,20][5,10,20],分裂並提升 1010。原根節點因此成為 [10,30,50][10,30,50],也超出容量;再將中間值 3030 提升,形成新根節點 [30][30]。
  4. 插入 2525 至鍵值範圍 1010 與 3030 之間的葉節點;插入 4545 至鍵值範圍 3030 與 5050 之間的葉節點。

最後的 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 個,便將鍵值排序,取中間鍵值升到父節點,左右兩側的鍵值分別形成兩個節點。若根節點也溢位,則建立新根節點。

解題方法

依序插入題目中的數字,追蹤根節點及會發生溢位的節點:

  1. 插入 20,3020,30,根節點為 [20,30][20,30]。
  2. 插入 4040 後,根節點溢位。將中間鍵值 3030 升為根,得到根節點 [30][30],左右子節點為 [20][20]、[40][40]。
  3. 插入 50,6050,60 後,右側節點 [40,50,60][40,50,60] 溢位,將 5050 升至根,得到根節點 [30,50][30,50],子節點依序為 [20][20]、[40][40]、[60][60]。
  4. 插入 7070,右側子節點成為 [60,70][60,70]。再插入 10,510,5,左側節點形成 [5,10,20][5,10,20],溢位後將 1010 升至根。此時根節點也溢位,鍵值為 [10,30,50][10,30,50];將中間鍵值 3030 升為新根。
  5. 新根為 [30][30]。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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」表示每個節點最多有 33 個子節點,因此最多可存 22 個鍵值。插入後若節點含有 33 個鍵值,就必須分裂:將中間鍵值提升至父節點,左右兩側鍵值分別留在新節點中。

若父節點因接收提升的鍵值而超出容量,也要再分裂;每分裂一個節點,就計為一次 node split operation。

解題方法

依序插入題目給的數字,記錄節點何時累積到 33 個鍵值而分裂:

  1. 插入 20,3020,30 後,根節點為 [20,30][20,30]。

  2. 插入 4040 後,根節點成為 [20,30,40][20,30,40],分裂並提升中間鍵值 3030。分裂次數:11。

    樹為根節點 [30][30],左右子節點分別為 [20][20]、[40][40]。

  3. 插入 50,6050,60 時,右側葉節點由 [40][40] 增至 [40,50,60][40,50,60],因此分裂並提升 5050 至根節點。分裂次數:22。

    根節點變為 [30,50][30,50],葉節點為 [20][20]、[40][40]、[60][60]。

  4. 插入 7070,右側葉節點成為 [60,70][60,70],未超出容量。插入 1010,左側葉節點成為 [10,20][10,20],也未超出容量。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

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 dd?

(A) 2
(B) 4
(C) 6
(D) 8
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這段程式使用 Dijkstra 單源最短路徑演算法,從頂點 START = 4 出發,計算起點到各頂點的目前最短距離,並將結果存入陣列 d。

  • d[v]:目前已知從起點到頂點 vv 的最短距離。
  • s[v]:頂點 vv 是否已確定最短距離。
  • 1000:代表沒有直接邊,可視為很大的距離。
  • 鬆弛:若經由頂點 uu 到達 ww 比目前距離更短,就更新 d[w]d[w]:
d[w]=min⁡(d[w], d[u]+l[u][w])d[w] = \min(d[w],\, d[u] + l[u][w])

程式將起點的距離設為 00,因此 d[4]=0d[4] = 0。

解題方法

起點為頂點 44。初始化時,程式從矩陣第 44 列讀入各頂點的直接距離,並將起點標記為已確定:

d=[1000, 1000, 1000, 12, 0, 2, 1000, 1000]d = [1000,\ 1000,\ 1000,\ 12,\ 0,\ 2,\ 1000,\ 1000]

每次迴圈從尚未確定的頂點中,選出 d 最小者,再依該頂點的出邊進行鬆弛。依序執行如下:

步驟選出的頂點距離更新
15經由 55 更新:d[6]=8d[6]=8、d[7]=10d[7]=10
26經由 66 到 77 的距離為 8+10=188+10=18,不小於目前的 1010
37經由 77 更新:d[0]=10+4=14d[0]=10+4=14
43經由 33 更新:d[2]=12+4=16d[2]=12+4=16
50沒有更短的距離更新
62經由 22 更新:d[1]=16+2=18d[1]=16+2=18

迴圈結束時:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9-(2) 題

What is the value of the largest element in array dd?

(A) 6
(B) 12
(C) 18
(D) 24
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這段程式使用 Dijkstra 最短路徑演算法,從起點 START = 4 計算到各頂點的最短距離。

s[j] 表示頂點 jj 是否已確定最短距離;d[j] 表示目前從起點到頂點 jj 的最短距離估計。每輪選出尚未確定、且 d 值最小的頂點 uu,再用

d[w]←min⁡(d[w], d[u]+l[u][w])d[w] \leftarrow \min\bigl(d[w],\ d[u] + l[u][w]\bigr)

更新其他頂點。矩陣中的 1000 代表沒有直接連線。

解題方法

起點是頂點 44。初始化後:

d=[1000, 1000, 1000, 12, 0, 2, 1000, 1000]d = [1000,\ 1000,\ 1000,\ 12,\ 0,\ 2,\ 1000,\ 1000]

接著依照每輪選出的最小距離頂點進行鬆弛:

選出的頂點 uud[u]d[u]鬆弛後的更新
5522d[6]=8, d[7]=10d[6]=8,\ d[7]=10
6688到 77 的距離為 1818,不優於目前的 1010
771010d[0]=14d[0]=14
331212d[2]=16d[2]=16
001414到 11 的候選距離為 14+1000=101414+1000=1014,不優於目前的 10001000
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9-(3) 題

What is the time complexity of the above program?

(A) O(log⁡N)O(\log N)
(B) O(N)O(N)
(C) O(Nlog⁡N)O(N\log N)
(D) O(N2)O(N^2)
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這段程式使用鄰接矩陣表示加權圖,並以類似 Dijkstra 演算法的方式反覆選出目前距離最小、尚未處理的頂點,再更新其他頂點的暫定距離。

時間複雜度要看程式實際執行的迴圈次數,以及每次迴圈內的工作量;不必先判斷演算法是否完整求出所有最短路徑。

解題方法

初始化時,第一個 for 迴圈執行 NN 次,每次設定一個 s[i] 與 d[i],耗時為 O(N)O(N)。

主要迴圈執行 N−2N-2 次,因此迴圈次數為 O(N)O(N)。每次迴圈包含:

  • 透過 j 迴圈掃描全部 NN 個頂點,找出距離最小的未處理頂點,耗時 O(N)O(N)。
  • 透過 w 迴圈掃描全部 NN 個頂點,嘗試更新距離,耗時 O(N)O(N)。

所以每次主要迴圈耗時為 O(N)+O(N)=O(N)O(N)+O(N)=O(N),總耗時為:

O(N)×O(N)=O(N2)O(N)\times O(N)=O(N^2)
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Let AA be an array of integers. Consider the following algorithms.

Algorithm 1: P(A,p,r)P(A,p,r)

  1. index=Random(p,r)index = Random(p,r);
  2. Exchange A[index]A[index] with A[r]A[r].
  3. x=A[r]x = A[r].
  4. i=p−1i = p - 1.
  5. For j=pj = p to r−1r - 1:
    • If A[j]≤xA[j] \le x, then:
      • i=i+1i = i + 1.
      • Exchange A[i]A[i] with A[j]A[j].
  6. Exchange A[i+1]A[i+1] with A[r]A[r].
  7. Return i+1i + 1.

Algorithm 2: Q(A,p,r)Q(A,p,r)

  1. If p<rp < r, then:
    • Repeat:
      1. q=P(A,p,r)q = P(A,p,r).
    1. Until the larger part is at most 2/32/3 of the subarray A[p..r]A[p..r].
    • Q(A,p,q−1)Q(A,p,q-1).
    • Q(A,q+1,r)Q(A,q+1,r).

第 10-(1) 題

Algorithm QQ has running time ____ in the average case (as close as possible).

(A) O(log⁡n)O(\log n)
(B) O(n)O(n)
(C) O(nlog⁡n)O(n\log n)
(D) O(n2)O(n^2)
(E) O(log⁡2n)O(\log^2 n)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是隨機快速排序的平均時間,以及「重複分割直到切分夠平衡」對遞迴深度的影響。

令目前子陣列長度為 mm。一次呼叫 P(A,p,r)P(A,p,r) 會掃描整個子陣列,因此耗時為 Θ(m)\Theta(m)。若每次分割都能讓較大的子問題至多為原問題的 2/32/3,遞迴就會維持平衡,深度為 Θ(log⁡n)\Theta(\log n)。

解題方法

先看一次分割成功的機率。假設元素互異,隨機選取的樞紐元素,其排序名次均勻分布。若樞紐左側有 kk 個元素,左右子問題大小分別為 kk 與 m−1−km-1-k。符合接受條件的樞紐名次,約落在中間三分之一,因此一次分割成功的機率是常數;當 mm 增大時,此機率約為 1/31/3。

所以重複分割直到成功所需的嘗試次數,期望為常數。每次嘗試耗時 Θ(m)\Theta(m),故該節點的期望分割成本仍為 Θ(m)\Theta(m)。

成功後,較大的子問題至多為原問題的 2/32/3;另一個子問題也不能太小,因為兩邊大小總和為 m−1m-1。因此遞迴深度為 Θ(log⁡n)\Theta(\log n)。每一層處理的子陣列長度總和為 Θ(n)\Theta(n),總時間為

Θ(n)×Θ(log⁡n)=Θ(nlog⁡n)\Theta(n)\times\Theta(\log n)=\Theta(n\log n)
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 10-(2) 題

What is the probability that the repeat loop (lines 2–4) of Algorithm QQ is executed exactly once?

(A) 1/21/2
(B) 1/41/4
(C) 1/31/3
(D) 2/32/3
(E) 3/43/4

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每次呼叫 P(A,p,r)P(A,p,r) 時,樞紐元素從目前子陣列中均勻隨機選出。分割後,演算法 QQ 會檢查較大的那一側是否不超過子陣列的 2/32/3;若符合,重複迴圈就停止。

解題方法

將樞紐在子陣列中的相對位置視為 00 到 11 之間的均勻隨機比例 xx。分割後兩側的比例約為 xx 與 1−x1-x。要讓較大的一側不超過 2/32/3,須同時滿足:

x≤23且1−x≤23x \le \frac{2}{3} \qquad\text{且}\qquad 1-x \le \frac{2}{3}

因此:

13≤x≤23\frac{1}{3} \le x \le \frac{2}{3}

符合條件的位置占整個區間的比例為:

23−13=13\frac{2}{3}-\frac{1}{3}=\frac{1}{3}
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 10-(3) 題

What is the average number of iterations that the repeat loop (lines 2–4) of Algorithm QQ is executed?

(A) 2
(B) 3
(C) 4
(D) 1.5
(E) 2.5

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是幾何分布的期望值。Q 每次執行 P 都隨機選一個樞紐,直到分割結果符合條件才停止;若每次成功機率為 pp,所需執行次數的期望值為:

E=1pE=\frac{1}{p}

解題方法

設目前子陣列長度為 nn。要讓較大的分割部分至多占子陣列的 2/32/3,樞紐必須落在中間的 1/31/3 區段:左、右兩部分都不能超過 2n/32n/3。

在標準分析中,假設元素互異、樞紐的排名等機率出現,能符合條件的樞紐約占全部樞紐的 1/31/3,因此每次 P 成功的機率為:

p=13p=\frac{1}{3}

代入幾何分布的期望值:

E=1p=11/3=3E=\frac{1}{p}=\frac{1}{1/3}=3

此期望值包含最後一次成功的執行。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Given a sequence of nn positive numbers, we want to put n−1n-1 pairs of parentheses around the nn numbers, such that the total sum of the n−1n-1 intermediate sums is minimized.

For example, given four positive numbers in order 4,1,2,34, 1, 2, 3, we can put three pairs of parentheses around and add them as ((4+1)+(2+3))=((5)+(5))=(10)((4+1)+(2+3)) = ((5)+(5)) = (10). Three intermediate sums are generated, namely 55, 55, and 1010. The total sum of these three intermediate sums is 5+5+10=205+5+10=20. If we put the parentheses differently as (4+((1+2)+3))(4+((1+2)+3)), the three intermediate sums generated are 33, 66, and 10,andthesumis10, and the sum is 19$.

Consider the input: 4,4,8,5,4,3,54, 4, 8, 5, 4, 3, 5. Let the smallest intermediate sum be XX.

第 11-(1) 題

X mod 10X \bmod 10 is ____.

(A) 1
(B) 2
(C) 3
(D) 4
(E) 5

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每一對括號是一次「把相鄰兩段合併」的加法,產生的中間和=這兩段涵蓋的所有數字總和。數字順序不能改變,所以這是區間動態規劃(與矩陣鏈乘、石子合併同型)。

令 S(i,j)S(i,j) 為第 ii 到第 jj 個數的總和,dp[i][j]dp[i][j] 為把這段加成一個數的最小中間和總和:

dp[i][i]=0,dp[i][j]=S(i,j)+min⁡i≤k<j(dp[i][k]+dp[k+1][j])dp[i][i]=0,\qquad dp[i][j]=S(i,j)+\min_{i\le k<j}\bigl(dp[i][k]+dp[k+1][j]\bigr)

解題方法

輸入 4,4,8,5,4,3,54,4,8,5,4,3,5,總和 3333。依區間長度由短到長填表(每列由左而右是起點 1,2,…1,2,\ldots 的區間):

長度dpdp 值
28, 12, 13, 9, 7, 88,\ 12,\ 13,\ 9,\ 7,\ 8
324, 29, 26, 19, 1924,\ 29,\ 26,\ 19,\ 19
442, 42, 39, 3442,\ 42,\ 39,\ 34
558, 55, 5758,\ 55,\ 57
671, 7571,\ 75
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 11-(2) 題

The integer part of X/10X/10 is ____.

(A) 6
(B) 7
(C) 8
(D) 9
(E) 5

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每一對括號是一次「把相鄰兩段合併」的加法,產生的中間和=這兩段涵蓋的所有數字總和。數字順序不能改變,所以這是區間動態規劃(與矩陣鏈乘、石子合併同型)。

令 S(i,j)S(i,j) 為第 ii 到第 jj 個數的總和,dp[i][j]dp[i][j] 為把這段加成一個數的最小中間和總和:

dp[i][i]=0,dp[i][j]=S(i,j)+min⁡i≤k<j(dp[i][k]+dp[k+1][j])dp[i][i]=0,\qquad dp[i][j]=S(i,j)+\min_{i\le k<j}\bigl(dp[i][k]+dp[k+1][j]\bigr)

解題方法

輸入 4,4,8,5,4,3,54,4,8,5,4,3,5,總和 3333。依區間長度由短到長填表(每列由左而右是起點 1,2,…1,2,\ldots 的區間):

長度dpdp 值
28, 12, 13, 9, 7, 88,\ 12,\ 13,\ 9,\ 7,\ 8
324, 29, 26, 19, 1924,\ 29,\ 26,\ 19,\ 19
442, 42, 39, 3442,\ 42,\ 39,\ 34
558, 55, 5758,\ 55,\ 57
671, 7571,\ 75
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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 O(n2)O(n^2)-time algorithm.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每一對括號是一次「把相鄰兩段合併」的加法,產生的中間和=這兩段涵蓋的所有數字總和。數字順序不能改變,所以這是區間動態規劃(與矩陣鏈乘、石子合併同型)。

令 S(i,j)S(i,j) 為第 ii 到第 jj 個數的總和,dp[i][j]dp[i][j] 為把這段加成一個數的最小中間和總和:

dp[i][i]=0,dp[i][j]=S(i,j)+min⁡i≤k<j(dp[i][k]+dp[k+1][j])dp[i][i]=0,\qquad dp[i][j]=S(i,j)+\min_{i\le k<j}\bigl(dp[i][k]+dp[k+1][j]\bigr)

解題方法

輸入 4,4,8,5,4,3,54,4,8,5,4,3,5,總和 3333。依區間長度由短到長填表(每列由左而右是起點 1,2,…1,2,\ldots 的區間):

長度dpdp 值
28, 12, 13, 9, 7, 88,\ 12,\ 13,\ 9,\ 7,\ 8
324, 29, 26, 19, 1924,\ 29,\ 26,\ 19,\ 19
442, 42, 39, 3442,\ 42,\ 39,\ 34
558, 55, 5758,\ 55,\ 57
671, 7571,\ 75

例:dp[1][3]=16+min⁡(0+12, 8+0)=24dp[1][3]=16+\min(0+12,\ 8+0)=24;dp[4][7]=17+min⁡(0+19, 9+8, 19+0)=34dp[4][7]=17+\min(0+19,\ 9+8,\ 19+0)=34。

整段 [1,7][1,7] 依最後一次合併的切點 kk:

kkdp[1][k]+dp[k+1][7]dp[1][k]+dp[k+1][7]
10+75=750+75=75
28+57=658+57=65
324+34=5824+34=58
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Let G=(V,E)G=(V,E) be a connected flow network with source ss, sink tt, and an integer capacity c(e)c(e) on each edge e∈Ee\in E. Let CC be the maximum capacity of the edges. Consider the following proposed algorithm.

Algorithm 3: Proposed_Max_Flow(G,s,t)Proposed\_Max\_Flow(G,s,t)

  1. C′=max⁡e∈Ec(e)C' = \max_{e\in E} c(e);
  2. Initialize flow f=0f=0;
  3. K=2⌊lg⁡C′⌋K = 2^{\lfloor \lg C' \rfloor};
  4. While K≥1K \ge 1:
    • While there exists an augmenting path pp of capacity at least KK:
      • Augment ff along pp.
    • K=K/2K = K/2;
  5. Return ff.

第 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 C∣E∣C|E|.
(D) It takes O(V)O(V) time to find an augmenting path of capacity at least KK, if one exists.
(E) The inner while loop (lines 5–6) is executed VEVE times for each KK.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這是 容量縮放(capacity scaling) 版的 Ford–Fulkerson(CLRS 習題 26-5 的情境):門檻 KK 從不超過 CC 的最大 2 的冪次開始,每個階段只找殘餘容量 ≥K\ge K 的增廣路徑,找不到就把 KK 減半。三個基本事實:

  1. 最大流值=最小割容量(最大流最小割定理),這個數值唯一。
  2. 任一割最多切到 ∣E∣|E| 條邊、每條容量 ≤C\le C,所以割容量 ≤C∣E∣\le C|E|。
  3. 在殘餘網路中只保留容量 ≥K\ge K 的邊做 BFS/DFS,就能在 O(V+E)=O(E)O(V+E)=O(E) 時間找到(或確定沒有)容量至少 KK 的增廣路徑(GG 連通,所以 E≥V−1E\ge V-1)。

選項分析

  • (A) 正確。 最小割的「容量」是一個最小值,必然唯一;可能不唯一的是達到這個值的割本身。
  • **(B) 錯誤。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 12-(2) 題

The running time of the proposed algorithm is ____.

(A) O(VE2)O(VE^2)
(B) O(V2E)O(V^2E)
(C) O(VElg⁡C)O(VE\lg C)
(D) O(E2lg⁡C)O(E^2\lg C)
(E) O(Elg⁡C)O(E\lg C)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

容量縮放(capacity scaling)的 Ford–Fulkerson:門檻 KK 從 2⌊lg⁡C⌋2^{\lfloor\lg C\rfloor} 開始,每個階段只沿殘餘容量 ≥K\ge K 的增廣路徑推流,找不到就把 KK 減半,直到 K<1K<1。

解題方法

把總時間拆成三個因子相乘:

  1. 階段數:KK 從約 CC 減半到 11,共 ⌊lg⁡C⌋+1=O(lg⁡C)\lfloor\lg C\rfloor+1=O(\lg C) 個階段。
  2. 每階段的增廣次數:上一階段(門檻 2K2K)結束時,殘餘網路中從 ss 經容量 ≥2K\ge2K 的邊可達的點集 SS 形成一個割,割上每條邊的殘餘容量都 <2K<2K,所以剩下還能增加的流量 <2K∣E∣<2K|E|。本階段每次增廣至少增加 KK,因此最多 2∣E∣=O(E)2|E|=O(E) 次。
  3. 每次增廣的成本:在只保留容量 ≥K\ge K 的殘餘邊上做 BFS/DFS,O(V+E)=O(E)O(V+E)=O(E)(網路連通,E≥V−1E\ge V-1)。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 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 SS be the set of ss and the nodes reachable from ss in the residual flow network. Then SS and V∖SV\setminus S form a minimum cut.
(D) Let (S,T)(S,T) be a minimum cut corresponding to a maximum flow of GG. Then all the edges from SS to TT have zero residual capacity.
(E) With integral capacity on each edge, a maximum flow may have non-integral flow on some edge(s).

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考最大流與最小割定理、割的唯一性,以及整數容量對最大流的影響。

  • 割:將頂點分成包含來源 ss 的集合 SS 與包含匯點 tt 的集合 T=V∖ST=V\setminus S。割的容量是所有由 SS 指向 TT 的邊容量總和:
    c(S,T)=∑u∈S, v∈Tc(u,v).c(S,T)=\sum_{u\in S,\ v\in T} c(u,v).
  • 殘餘網路:正向邊的殘餘容量為 c(u,v)−f(u,v)c(u,v)-f(u,v);反向邊的殘餘容量反映可撤回的流量。
  • 最大流最小割定理:當殘餘網路中不存在從 ss 到 tt 的增廣路徑時,最大流值等於某個最小割容量。由殘餘網路中從 ss 可到達的頂點可構造出這個最小割。
  • 整數容量定理:若每條邊的容量都是整數,則存在一個整數最大流;但這不代表每個最大流都必須是整數。

解題方法

逐項檢查敘述是否能由定理直接推出。涉及「唯一」的敘述,須區分「各邊容量不同」與「不同邊集合的容量總和不同」;涉及「可能」的敘述,則只要有一個符合條件的例子即可判定。

選項分析

(A) 錯誤。 各邊容量互不相同,不代表不同割的容量總和互不相同。割容量是多條邊容量的總和,而不同整數可以有相同的總和,例如 1+4=2+31+4=2+3。因此,容量互異無法保證最小割唯一。

(B) 錯誤。 最大流的總值唯一,但達到該值的各邊流量配置未必唯一。不同路徑可能承載不同流量組合而得到相同的最大流值;

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Given an undirected graph G=(V,E)G=(V,E) with n=∣V∣n=|V|, m=∣E∣m=|E|, and weights w:E→R+w:E\to\mathbb{R}^+, we define an order v1,…,vnv_1,\ldots,v_n of VV to be a Magic Order if, for all i∈{2,…,n}i\in\{2,\ldots,n\}:

∑e∈E({v1,…,vi−1},{vi})w(e)=max⁡j∈{i,…,n}∑e∈E({v1,…,vi−1},{vj})w(e),\sum_{e\in E(\{v_1,\ldots,v_{i-1}\},\{v_i\})} w(e) = \max_{j\in\{i,\ldots,n\}} \sum_{e\in E(\{v_1,\ldots,v_{i-1}\},\{v_j\})} w(e),

where E(A,B)E(A,B) indicates the edges between disjoint vertex subsets AA and BB.

Consider the following incomplete algorithm.

Algorithm 4: Magic_Order(G)Magic\_Order(G)

  1. Set key(v)=0key(v)=0 for all v∈Vv\in V.
  2. For i=1i=1 to nn:
    • Choose viv_i from V∖{v1,…,vi−1}V\setminus\{v_1,\ldots,v_{i-1}\} such that it has maximum key value (breaking ties arbitrarily).
    • For v∈V∖{v1,…,vi}v\in V\setminus\{v_1,\ldots,v_i\}:
      • key(v)=key(v)+‾key(v)=key(v)+\underline{\hspace{1em}}.

第 13-(1) 題

What is the missing part in line 5 of the above algorithm?

(A) ∑e∈E({v1,…,vi−1},{vi})w(e)\sum_{e\in E(\{v_1,\ldots,v_{i-1}\},\{v_i\})} w(e)
(B) ∑e∈E({v1,…,vi−1},{v})w(e)\sum_{e\in E(\{v_1,\ldots,v_{i-1}\},\{v\})} w(e)
(C) ∑e∈E({vi−1},{v})w(e)\sum_{e\in E(\{v_{i-1}\},\{v\})} w(e)
(D) ∑e∈E({vi−1},{vi})w(e)\sum_{e\in E(\{v_{i-1}\},\{v_i\})} w(e)
(E) ∑e∈E({vi},{v})w(e)\sum_{e\in E(\{v_i\},\{v\})} w(e)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是 最大鄰接順序(Maximum Adjacency Ordering) 的鍵值維護。

在選出前 i−1i-1 個頂點後,尚未選出的頂點 xx 的鍵值應代表它與已選頂點集合的總連接權重:

key(x)=∑e∈E({v1,…,vi−1},{x})w(e).key(x)=\sum_{e\in E(\{v_1,\ldots,v_{i-1}\},\{x\})}w(e).

因此,每選出一個新頂點 viv_i,所有尚未選出的頂點 vv 都要把「與 viv_i 之間的邊權重」加進 key(v)key(v)。

解題方法

一開始尚未選出任何頂點,所以所有 key(v)key(v) 設為 00。選出 viv_i 後,鍵值的變化只來自新加入已選集合的 viv_i,故更新量是:

∑e∈E({vi},{v})w(e).\sum_{e\in E(\{v_i\},\{v\})}w(e).

這樣每次更新後,key(v)key(v) 仍等於 vv 與目前已選頂點集合之間的總邊權重。每輪挑選鍵值最大的未選頂點,就符合題目 Magic Order 的定義。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 13-(2) 題

Which of the following statements are true?

(A) It takes O(n)O(n) 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 O(log⁡n)O(\log n).
(C) If we use a Fibonacci heap, then the amortized cost of line 3 is O(log⁡n)O(\log n).
(D) If we use a Fibonacci heap, then line 5 has amortized cost O(1)O(1).
(E) If we use a binary heap, then line 5 has worst-case time complexity O(log⁡n)O(\log n).

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是「最大鍵值優先佇列」中,取出最大值與更新鍵值的時間複雜度。演算法每次選出目前 key 最大的未選頂點;接著,對每個尚未選取的頂點,將它與新選頂點之間的邊權重總和加到 key 上。

因此,資料結構需要支援:

  • 取出最大值:對應第 3 行選擇 viv_i。
  • 增加鍵值:對應第 5 行更新 key(v)。

若採用最大堆,二元堆的增加鍵值在最壞情況下為 O(log⁡n)O(\log n);斐波那契堆的增加鍵值則為攤銷 O(1)O(1)。

解題方法

逐項將第 3 行與第 5 行對應到優先佇列操作:

  • 第 3 行:從最多 nn 個未選頂點中取出鍵值最大者。
  • 第 5 行:將某個未選頂點的鍵值增加一個非負邊權重總和。

陣列取最大值時須逐一比較所有候選者,成本為 O(n)O(n)。二元最大堆取最大值需要移除堆頂並恢復堆序,成本為 O(log⁡n)O(\log n)。斐波那契最大堆取最大值的攤銷成本也是 O(log⁡n)O(\log n)。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 13-(3) 題

With a Fibonacci heap, the above algorithm has amortized cost ____ (pick one as close as possible).

(A) O(nlog⁡n)O(n\log n)
(B) O(mlog⁡n)O(m\log n)
(C) O(n+mlog⁡n)O(n+m\log n)
(D) O(m+nlog⁡n)O(m+n\log n)
(E) O(mlog⁡m)O(m\log m)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

每次選出頂點 viv_i 後,對尚未選取的頂點 vv,更新它與已選頂點集合 {v1,…,vi}\{v_1,\ldots,v_i\} 之間的總邊權。題目空格應填入 viv_i 與 vv 之間邊的權重總和:

∑e∈E({vi},{v})w(e)\sum_{e\in E(\{v_i\},\{v\})} w(e)

若兩點間沒有邊,此值為 00。因此,選取 viv_i 前的 key(v)key(v) 正好是 vv 與目前已選頂點集合之間的邊權總和;每次取出最大 key 的頂點,就符合 Magic Order 的定義。

解題方法

使用最大 Fibonacci heap 儲存尚未選取的頂點,並以 key(v)key(v) 作為優先值。

  • 將 nn 個頂點及其初始 key 值 00 放入堆中,建堆成本為 O(n)O(n)。
  • 每輪取出最大 key 的頂點,共 nn 次。Fibonacci heap 的 extract-max 攤銷成本為 O(log⁡n)O(\log n),合計 O(nlog⁡n)O(n\log n)。
  • 處理已選頂點的鄰邊,更新尚未選取鄰點的 key。每條邊至多處理一次,共 O(m)O(m) 次更新。最大 Fibonacci heap 的 increase-key 攤銷成本為 O(1)O(1),合計 O(m)O(m)。

因此總攤銷時間為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Let GG be a connected, simple, undirected graph of at least 6 nodes, and let TT be a BFS tree of GG rooted at node rr. Answer the following questions.

第 14-(1) 題

If (x,y)(x,y) is an edge in GG and xx has depth 2 in TT, then yy may have depth ____ in TT.

(A) 0
(B) 1
(C) 2
(D) 3
(E) 4

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

在以 rr 為根的 BFS 樹中,節點 vv 的深度等於圖中從 rr 到 vv 的最短路徑長度,記為 d(r,v)d(r,v)。

若 (x,y)(x,y) 是圖 GG 的一條邊,從 rr 到 xx 的最短路徑再接上邊 (x,y)(x,y),就得到一條從 rr 到 yy、長度為 d(r,x)+1d(r,x)+1 的路徑。因此:

d(r,y)≤d(r,x)+1d(r,y)\le d(r,x)+1

反過來也成立,所以相鄰節點的深度差至多為 11:

∣d(r,x)−d(r,y)∣≤1|d(r,x)-d(r,y)|\le 1

解題方法

已知 xx 的深度為 22,代入相鄰節點深度差的限制:

∣2−d(r,y)∣≤1|2-d(r,y)|\le 1

因此 yy 的深度只能是 11、22 或 33。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 14-(2) 題

If nodes xx and yy both have depth 2 in TT and x≠yx\ne y, then the shortest path (in terms of the number of edges) that connects xx and yy may have ____ edges.

(A) 0
(B) 1
(C) 2
(D) 3
(E) 4

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

在以 rr 為根的 BFS 樹 TT 中,節點的深度等於它在原圖 GG 中到 rr 的最短距離。若兩個節點在 GG 中相鄰,它們的深度至多相差 11。

題目中的 x,yx,y 是不同節點,且都在深度 22。沿 BFS 樹從 xx 經共同根 rr 到 yy,路徑長度為 2+2=42+2=4。因此,xx 到 yy 的最短路徑至少有 11 條邊,至多有 44 條邊。

解題方法

依序判斷長度 11、22、33、44 是否都能出現。以下各例都可補足節點,使圖至少有 66 個節點,且不改變 xx、yy 間的最短距離。

  • **長度 11:**直接加入邊 (x,y)(x,y),則兩節點相鄰。
  • **長度 22:**令 x,yx,y 是同一個深度 11 節點 aa 的子節點,路徑為 x−a−yx-a-y。
  • **長度 33:**令 x,yx,y 的深度 11 父節點分別為 a,ba,b,再加入深度 33 節點 u,vu,v,並加入邊 (x,u),(u,v),(v,y)(x,u),(u,v),(v,y)。如此 x−u−v−yx-u-v-y 長度為 33,且沒有長度 11 或 22 的捷徑。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 14-(3) 題

If node rr (the root of TT) has degree 5 in GG, then rr may have degree ____ in TT.

(A) 1
(B) 2
(C) 3
(D) 4
(E) 5

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

在以 rr 為根的廣度優先搜尋樹(BFS tree)中,樹上的每條邊都連接原圖 GG 中相鄰的節點。BFS 會先從根節點探索距離為 11 的所有節點,因此 rr 在 GG 中的每個鄰居,都會成為 rr 在 BFS 樹 TT 中的子節點。

所以根節點的度數在兩張圖中相同:

deg⁡T(r)=deg⁡G(r)\deg_T(r)=\deg_G(r)

解題方法

已知 deg⁡G(r)=5\deg_G(r)=5。根節點的五個鄰居都與 rr 直接相連,BFS 從 rr 開始搜尋時,會將這五個鄰居全部列為第一層節點,並以樹邊連到 rr。

因此:

deg⁡T(r)=5\deg_T(r)=5

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

The knapsack problem can be defined as follows. You may assume that it takes O(1)O(1) time to perform an arithmetic operation on a pair of integers in [U2][U^2] for some U≥232U\ge 2^{32}.

Input: an integer mm and nn pairs of positive integers (w1,v1),(w2,v2),…,(wn,vn)(w_1,v_1),(w_2,v_2),\ldots,(w_n,v_n), where m,n∈[U]m,n\in[U] and wi,vi∈[U]w_i,v_i\in[U] for every i∈{1,2,…,n}i\in\{1,2,\ldots,n\}.

Goal: output a subset SS of {1,2,…,n}\{1,2,\ldots,n\} such that

∑i∈Swi≤mand∑i∈Svi\sum_{i\in S}w_i\le m \quad\text{and}\quad \sum_{i\in S}v_i

is the largest possible.

第 15-(1) 題

If m=Θ(n2)m=\Theta(n^2), then the above knapsack problem is known to be solvable in ____ time (as best as possible).

(A) O(n)O(n)
(B) O(nlog⁡n)O(n\log n)
(C) O(n2)O(n^2)
(D) O(nm)O(nm)
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是 0/10/1 背包的動態規劃。每件物品只能選或不選;以背包容量作為 DP 狀態,可在偽多項式時間內求得最佳價值。

解題方法

令 DP[j]DP[j] 表示目前處理過的物品中,總重量不超過 jj 時可取得的最大總價值。處理第 ii 件物品時,若容量 j≥wij\ge w_i,更新為

DP[j]=max⁡(DP[j], DP[j−wi]+vi).DP[j]=\max\bigl(DP[j],\ DP[j-w_i]+v_i\bigr).

容量須由大到小更新,避免同一件物品被重複使用。對每件物品最多檢查 mm 個容量,因此時間複雜度為

O(nm).O(nm).

題目給定 m=Θ(n2)m=\Theta(n^2),代入可得 O(nm)=O(n3)O(nm)=O(n^3)。選項中以 O(nm)O(nm) 表示這個動態規劃時間界。

題目也指定整數算術可在 O(1)O(1) 時間完成,因此每次狀態轉移不必再乘上整數位數的成本。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(2) 題

If m=Θ(n2)m=\Theta(n^2) and wi∈{1}w_i\in\{1\} for every i∈{1,2,…,n}i\in\{1,2,\ldots,n\}, then the above knapsack problem is known to be solvable in ____ time (as best as possible).

(A) O(n)O(n)
(B) O(nlog⁡n)O(n\log n)
(C) O(n2)O(n^2)
(D) O(nm)O(nm)
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

背包問題要在總重量不超過容量 mm 的條件下,讓總價值最大。此題每件物品的重量都是 11,且每件物品的價值 viv_i 都是正整數。

解題方法

由 m=Θ(n2)m=\Theta(n^2) 可知,當 nn 充分大時,m≥nm\ge n。把全部 nn 件物品放入背包,總重量為

∑i=1nwi=∑i=1n1=n≤m.\sum_{i=1}^{n} w_i=\sum_{i=1}^{n}1=n\le m.

因此所有物品都能放入背包。又因為每個 vi>0v_i>0,加入任何一件物品都會增加總價值,所以選取全部物品正是最佳解。

演算法只需讀取輸入並輸出集合 {1,2,…,n}\{1,2,\ldots,n\},時間為 O(n)O(n)。輸出包含 nn 個索引,因此至少需要 Ω(n)\Omega(n) 時間;故最佳漸近時間為 Θ(n)\Theta(n)。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15-(3) 題

If m=Θ(n2)m=\Theta(n^2) and wi∈{1,2}w_i\in\{1,2\} for every i∈{1,2,…,n}i\in\{1,2,\ldots,n\}, then the above knapsack problem is known to be solvable in ____ time (as best as possible).

(A) O(n)O(n)
(B) O(nlog⁡n)O(n\log n)
(C) O(n2)O(n^2)
(D) O(nm)O(nm)
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

背包容量限制為 mm,每件物品的重量為 wiw_i,價值為 viv_i。本題所有 viv_i 都是正整數,因此只要所有物品放得進背包,最佳解就是選入全部物品。

解題方法

因為每件物品的重量只可能是 11 或 22,所以總重量至多為

∑i=1nwi≤2n.\sum_{i=1}^{n} w_i \le 2n.

題目給定 m=Θ(n2)m=\Theta(n^2),表示當 nn 充分大時,mm 至少為某個正的常數乘上 n2n^2,因此 m≥2nm\ge 2n。所有物品都能放入背包。又因為每件物品的價值皆為正,選入全部物品可使總價值最大。

演算法只需讀取 nn 組物品資料,並輸出全部 nn 件物品,時間為 O(n)O(n)。讀取輸入至少需要檢查 nn 組資料,因此時間下界為 Ω(n)\Omega(n);故最佳可能時間為 Θ(n)\Theta(n)。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

A Hamiltonian cycle of a graph GG is a simple cycle that visits all the nodes in GG. Suppose that there is an O(n7)O(n^7)-time algorithm that decides HamC(G)HamC(G) for any nn-node graph GG.

HamC(G)HamC(G)
Input: a simple undirected graph GG
Output: “true,” if GG has a Hamiltonian cycle; “false,” otherwise.

Complete Algorithm 5, which is an O(n7)O(n^7)-time algorithm that uses HamC(G)HamC(G) at most once to decide HamC3(G,x,y,z)HamC3(G,x,y,z) for any nn-node graph GG, for some distinct nodes x,y,z∈Gx,y,z\in G.

HamC3(G=(V,E),x,y,z)HamC3(G=(V,E),x,y,z)
Input: a simple undirected graph G=(V,E)G=(V,E) of ∣V∣≥3|V|\ge 3 and three distinct nodes x,y,z∈Gx,y,z\in G.
Output: “true,” if GG has a Hamiltonian cycle CC on which x,y,zx,y,z are consecutive nodes in an arbitrary order; “false,” otherwise.

Algorithm 5: HamC3(G=(V,E),x,y,z)HamC3(G=(V,E),x,y,z)

  1. U←V∪{a,b}U\leftarrow V\cup\{a,b\};
  2. F←EF\leftarrow E;
  3. If at least two of edges (x,y),(y,z),(z,x)(x,y),(y,z),(z,x) are not contained in EE:
  4.   Return ____.
  5. Else if exactly one of edges (x,y),(y,z),(z,x)(x,y),(y,z),(z,x) is not contained in EE:
    • Assume without loss of generality that (x,y)∉E(x,y)\notin E.
    • F←F∪{‾}F\leftarrow F\cup\{\underline{\hspace{1em}}\};
  6. Else:
    • F←F∪{‾}F\leftarrow F\cup\{\underline{\hspace{1em}}\};
  7. Return HamC(H=(U,F))HamC(H=(U,F)).

第 16-(1) 題

Which of the following shall be placed in the missing part of line 4?

(A) true
(B) false
(C) HamC(G=(V,E))HamC(G=(V,E))
(D) HamC(H=(U,F))HamC(H=(U,F))
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

若三個不同節點 x,y,zx,y,z 在 Hamiltonian cycle 上連續,三者之間必須有兩條邊,形成長度為 22 的路徑,例如 x−y−zx-y-z 使用 (x,y)(x,y)、(y,z)(y,z)。

因此,若 (x,y)(x,y)、(y,z)(y,z)、(z,x)(z,x) 中至少兩條邊不存在,三者之間最多只剩一條邊,不可能在 Hamiltonian cycle 上連續,應回傳 false。

解題方法

最直接的填法是直接回傳 false,即選項 (B)。

不過,依題目原文,選項 (D) 也會回傳 false:此時 H=(U,F)H=(U,F) 中新增的節點 a,ba,b 沒有連接任何邊,是孤立節點,所以 HH 不可能有 Hamiltonian cycle。此分支會直接回傳,不會再執行第 7 行;其他分支才呼叫第 7 行的 HamCHamC,所以每條執行路徑至多呼叫一次。HH 有 n+2n+2 個節點,呼叫時間仍為 O((n+2)7)=O(n7)O((n+2)^7)=O(n^7)。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 16-(2) 題

Which of the following shall be placed in the missing part of line 6?

(A) (a,x),(b,y)(a,x),(b,y)
(B) (a,y),(b,z)(a,y),(b,z)
(C) (a,z),(b,x)(a,z),(b,x)
(D) (a,b)(a,b)
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

在 Hamiltonian cycle 中,每個頂點都必須恰好有兩條邊屬於該環。因此,若新增頂點 aa 或 bb 在圖 HH 中的度數小於 22,HH 就不可能有 Hamiltonian cycle。

解題方法

第 6 行位於「(x,y),(y,z),(z,x)(x,y),(y,z),(z,x) 三條邊都已在 EE 中」的分支。此時新增的頂點 a,ba,b 尚未連接任何邊,必須由第 6 行新增的邊提供足夠的連接,才有機會形成 Hamiltonian cycle。

檢查選項可知,(A)、(B)、(C) 各只讓 aa、bb 分別連上一條邊;(D) 則只加入邊 (a,b)(a,b),使 aa、bb 的度數也都只有 11。因此,這四個選項都會使 HH 不可能有 Hamiltonian cycle,無法完成題目要求的判定演算法。

選項分析

  • (A) (a,x),(b,y)(a,x),(b,y):錯誤。 aa、bb 各只有一條 incident edge,不可能位於 Hamiltonian cycle。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 16-(3) 題

Which of the following shall be placed in the missing part of line 8?

(A) (a,x),(b,y)(a,x),(b,y)
(B) (a,y),(b,z)(a,y),(b,z)
(C) (a,z),(b,x)(a,z),(b,x)
(D) (a,b)(a,b)
(E) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Hamiltonian cycle 中每個頂點都必須在環上恰好使用兩條 incident edges,因此圖中每個頂點的度數至少要是 22。新增頂點 a,ba,b 後,若其中任一頂點的度數只有 11,新圖就不可能有 Hamiltonian cycle。

解題方法

在 Else 分支中,前三條邊 (x,y),(y,z),(z,x)(x,y),(y,z),(z,x) 都已存在。此時 FF 初始為 EE,而 EE 只包含原圖頂點 VV 之間的邊;a,ba,b 都沒有 incident edges。檢查各選項新增後,a,ba,b 的度數:

  • (A) 加入 (a,x),(b,y)(a,x),(b,y) 後,a,ba,b 的度數都為 11。
  • (B) 加入 (a,y),(b,z)(a,y),(b,z) 後,a,ba,b 的度數都為 11。
  • (C) 加入 (a,z),(b,x)(a,z),(b,x) 後,a,ba,b 的度數都為 11。
  • (D) 加入 (a,b)(a,b) 後,a,ba,b 的度數都為 11。

因此,四個選項都會使 HH 不可能有 Hamiltonian cycle,無法正確判定原圖是否存在符合條件的環。

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題