115 年 國立臺北大學資訊工程研究所《資料結構與演算法》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題10 分

Please convert the infix expression: (A+B)×C+(D−E)×(F+G)(A + B) \times C + (D - E) \times (F + G) into postfix notation and draw the corresponding binary expression tree.

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

這一題的完整詳解

核心觀念

本題考查:

  • 中序表示法(infix notation)
  • 後序表示法(postfix notation)
  • 運算子優先順序與結合性
  • 二元運算式樹(binary expression tree)

原式為:

(A+B)×C+(D−E)×(F+G)(A+B)\times C+(D-E)\times(F+G)

括號先計算,乘法優先於加法,因此實際結構為:

((A+B)×C)+((D−E)×(F+G))\bigl((A+B)\times C\bigr)+\bigl((D-E)\times(F+G)\bigr)

後序表示法的規則是:

  1. 先處理左子運算式。
  2. 再處理右子運算式。
  3. 最後輸出目前運算子的符號。

因此,二元運算式樹的後序走訪結果就是 postfix notation。

解題方法

左半部

左半部為:

(A+B)×C(A+B)\times C

其中:

(A+B)⇒A B +(A+B)\Rightarrow A\ B\ +

再將結果與 CC 進行乘法:

(A+B)×C⇒A B + C ×(A+B)\times C\Rightarrow A\ B\ +\ C\ \times

右半部

右半部為:

(D−E)×(F+G)(D-E)\times(F+G)

先處理兩個括號:

(D−E)⇒D E −(D-E)\Rightarrow D\ E\ - (F+G)⇒F G +(F+G)\Rightarrow F\ G\ +

再進行乘法:

(D−E)×(F+G)⇒D E − F G + ×(D-E)\times(F+G) \Rightarrow D\ E\ -\ F\ G\ +\ \times

合併左右子運算式

整個式子的最外層運算子是加法,因此最後輸出 ++:

(A+B)×C+(D−E)×(F+G)(A+B)\times C+(D-E)\times(F+G)

轉換為:

A B + C × D E − F G + × +A\ B\ +\ C\ \times\ D\ E\ -\ F\ G\ +\ \times\ +
🔒

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

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

免費註冊

第 2 題10 分

A binary search tree (BST) can be uniquely determined from its postorder traversal. Please draw the BST that corresponds to the following postorder sequence: B→A→D→C→H→G→F→EB \rightarrow A \rightarrow D \rightarrow C \rightarrow H \rightarrow G \rightarrow F \rightarrow E.

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

這一題的完整詳解

核心觀念

BST(Binary Search Tree,二元搜尋樹)滿足:

  • 任一節點左子樹的鍵值皆小於該節點。
  • 任一節點右子樹的鍵值皆大於該節點。
  • Postorder traversal(後序走訪)順序為:
Left→Right→Root\text{Left} \rightarrow \text{Right} \rightarrow \text{Root}

因此,後序序列的最後一個元素必為整棵 BST 的根節點。假設所有鍵值皆不重複,BST 可由後序序列唯一決定。

解題方法

給定後序序列:

B→A→D→C→H→G→F→EB \rightarrow A \rightarrow D \rightarrow C \rightarrow H \rightarrow G \rightarrow F \rightarrow E

1. 決定根節點

最後一個元素為 EE,所以根節點是 EE。

將其餘元素依照大小分成左右子樹:

  • 小於 EE:B,A,D,CB,A,D,C,屬於左子樹
  • 大於 EE:H,G,FH,G,F,屬於右子樹

因此:

Left of E:B,A,D,C\text{Left of }E: B,A,D,C Right of E:H,G,F\text{Right of }E: H,G,F

2. 建立左子樹

左子樹的後序序列為:

B→A→D→CB \rightarrow A \rightarrow D \rightarrow C

最後一個元素為 CC,所以左子樹根節點為 CC。

依照 CC 分割:

  • 小於 CC:B,AB,A
  • 大於 CC:DD

所以 CC 的左子樹後序序列為 B→AB \rightarrow A,右子樹為 DD。

對 B→AB \rightarrow A 而言,最後一個元素 AA 為根節點;B<AB<A,因此 BB 為 AA 的左子節點。

🔒

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

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

免費註冊

第 3 題10 分

An array containing 10 elements is sorted using quicksort. After the first partition and pivot exchange, the array becomes [8, 4, 13, 11, 16, 20, 19, 24, 18, 29]. Which element(s) could have been chosen as the pivot in the first step?

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

這一題的完整詳解

核心觀念

在快速排序(Quicksort)完成第一次分割(Partition)後,若某元素 A[i]A[i] 為該次採用的樞紐(Pivot),則該元素必須滿足以下兩項條件:

  1. 不小於左側所有元素:max⁡0≤j<iA[j]≤A[i]\max_{0 \le j < i} A[j] \le A[i]
  2. 不大於右側所有元素:A[i]≤min⁡i<k<nA[k]A[i] \le \min_{i < k < n} A[k]

即該 Pivot 已經被安置於陣列最終排序完成後的正確位置上。


關鍵推導

給定陣列 A=[8,4,13,11,16,20,19,24,18,29]A = [8, 4, 13, 11, 16, 20, 19, 24, 18, 29](共 10 個元素),逐一檢驗各位置是否符合 Pivot 條件:

| 索引 ii | 元素 A[i]A[i] | 左側最大值 max⁡(A[0..i−1])\max(A[0..i-1]) | 右側最小值 min⁡(A[i+1..9])\min(A[i+1..9]) | 是否可為 Pivot | 理由 |

🔒

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

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

免費註冊

第 4 題10 分

Starting with an empty max-heap, perform the following 8 operations in order: (Insert 8), (Insert 4), (Insert 9), (Insert 6), (Extract-Max), (Insert 13), (Insert 17), (Extract-Max). Please draw the resulting max-heap tree after all operations are completed.

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

這一題的完整詳解

核心觀念

本題考查最大堆積(max-heap)的插入與刪除最大值操作。

最大堆積必須同時符合:

  1. 完全二元樹:除最後一層外,每層皆填滿,最後一層由左至右排列。
  2. 最大堆積性質:每個節點的值都不小於其子節點,即
parent≥child\text{parent} \geq \text{child}

最大堆積通常以陣列儲存:

  • 插入:將新元素放在陣列最後,再向上調整(bubble up)。
  • Extract-Max:移除根節點,將最後一個元素移至根,再向下調整(heapify down)。

解題方法

依序執行 8 個操作,並以陣列表示當下的最大堆積。

1. Insert 8

插入後:

[8][8]

樹狀結構:

8

2. Insert 4

先將 4 放在最後,再與父節點 8 比較。因為 4<84 < 8,不需調整。

[8,4][8,4]
  8
 /
4

3. Insert 9

先放在陣列最後:

[8,4,9][8,4,9]

9 的父節點為 8,因為 9>89 > 8,交換:

[9,4,8][9,4,8]
  9
 / \
4   8

4. Insert 6

先放在最後:

[9,4,8,6][9,4,8,6]

6 的父節點為 4,因為 6>46 > 4,交換:

[9,6,8,4][9,6,8,4]
    9
   / \
  6   8
 /
4

5. Extract-Max

移除根節點 9,將最後一個元素 4 移至根:

[4,6,8][4,6,8]

此時 4 的子節點為 6 與 8,最大子節點為 8。因為 4<84 < 8,交換:

[8,6,4][8,6,4]
    8
   / \
  6   4

6. Insert 13

先放在最後:

[8,6,4,13][8,6,4,13]

13 的父節點為 6,交換後:

🔒

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

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

免費註冊

第 5 題10 分

Given the AVL tree shown in Figure 1, insert key 2 and then key 8. After each insertion, please draw the resulting tree once rebalancing has been performed to preserve the AVL property. (10%)

🖼️【此處有附圖,請對照原卷】
(Figure 1:根節點為 15,左子節點為 10、右子節點為 25;10 的左子節點為 5。)

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 1 頁

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

這一題的完整詳解

核心觀念

AVL 樹要求每個節點的左右子樹高度差至多為 11。定義平衡因子為

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

插入後若某節點的平衡因子變成 22 或 −2-2,就要依插入方向判斷旋轉類型。本題會依序用到 LL 單旋與 LR 雙旋。

解題方法

原始樹為:

       15
      /  \
    10    25
   /
  5

插入鍵值 2

依二元搜尋樹規則,2<152<15、2<102<10、2<52<5,因此插入為 55 的左子節點:

       15
      /  \
    10    25
   /
  5
 /
2

節點 1010 的左子樹比右子樹高 22,而新節點位於左子節點的左側,屬於 LL 型。以 1010 為軸向右旋轉,得到:

       15
      /  \
     5    25
    / \
   2  10

插入鍵值 8

從目前的樹搜尋:8<158<15、8>58>5、8<108<10,因此插入為 1010 的左子節點:

🔒

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

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

免費註冊

第 6 題10 分

Use Dijkstra algorithm step to step to find a shortest path from S to T in the following graph. (10%)

🖼️【此處有附圖,請對照原卷】
(無向加權圖,節點為 S, L, M, B, G, F, E, D, K, H, A, C, T,邊及權重如下:
(S,M):5, (S,B):5, (S,E):1, (S,A):5
(L,G):1, (L,B):3, (L,M):2
(M,B):4
(B,G):4, (B,F):4
(G,F):1, (G,D):3
(F,E):7, (F,K):1
(E,A):6
(D,T):6, (D,K):3
(K,H):2, (K,C):3, (K,A):6
(A,C):5
(H,T):3, (H,C):5
)

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 1 頁

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

這一題的完整詳解

核心觀念

Dijkstra 演算法用來求非負權重圖中,起點到各節點的最短距離。每一步從尚未確定的節點中,選取目前暫定距離最小者,將其距離確定,再用它更新相鄰節點:

d(v)←min⁡(d(v), d(u)+w(u,v))d(v)\leftarrow\min\bigl(d(v),\,d(u)+w(u,v)\bigr)

其中 d(v)d(v) 是起點 SS 到節點 vv 的暫定距離,w(u,v)w(u,v) 是邊 (u,v)(u,v) 的權重。

解題方法

初始化 d(S)=0d(S)=0,其餘節點距離為 ∞\infty。從 SS 出發,暫定距離為 55 的 A、B、MA、B、M 同距;同距時處理順序可以不同,不影響最短距離。

確定節點距離更新後的暫定距離
SS00E=1, A=5, B=5, M=5E=1,\ A=5,\ B=5,\ M=5
EE11F=8F=8;經 EE 到 AA 為 77,不優於 55
AA55C=10, K=11C=10,\ K=11
MM55L=7L=7;經 MM 到 BB 為 99,不優於 55
BB55經 BB 到 L=8、G=9、F=9L=8、G=9、F=9,皆不優於現有距離
🔒

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

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

免費註冊

第 7 題20 分

Use Kruskal and Prim algorithms to find the minimum spanning tree step by step of the following graph. (20%)

🖼️【此處有附圖,請對照原卷】
(無向加權圖,節點為 A, B, C, D, E, F, H, I,邊及權重如下:
(A,B):30, (A,I):19, (A,C):23, (A,F):16
(B,I):35, (B,H):32
(C,I):21, (C,D):20, (C,F):26, (C,E):15
(D,I):14, (D,H):64, (D,E):24
(E,H):2, (E,F):25
(H,I):40
)

🖼️ 本題含圖表,以下為原卷對應頁面:
原卷第 2 頁

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

這一題的完整詳解

核心觀念

最小生成樹(MST)必須連接圖中的所有頂點、不可形成迴圈,且總權重最小。這張圖有 8 個頂點,因此任何生成樹都恰有 8−1=78-1=7 條邊。

  • Kruskal 演算法:依權重由小到大檢查邊;若加入該邊不會形成迴圈,就選取。
  • Prim 演算法:從一個頂點開始,每次選擇連接「已加入樹中的頂點」與「樹外頂點」的最小權重邊。

Kruskal 演算法

將邊依權重遞增排列,逐一檢查:

權重邊處理結果
2(E,H)(E,H)選取
14(D,I)(D,I)選取
15(C,E)(C,E)選取
16(A,F)(A,F)選取
19(A,I)(A,I)選取
20(C,D)(C,D)選取
21(C,I)(C,I)略過;會形成迴圈
23(A,C)(A,C)略過;會形成迴圈
24(D,E)(D,E)略過;會形成迴圈
25(E,F)(E,F)略過;會形成迴圈
26(C,F)(C,F)略過;會形成迴圈
30(A,B)(A,B)選取,連入頂點 BB

選取 (A,B)(A,B) 後,8 個頂點已全部連通,且共選了 7 條邊,因此演算法完成。前 6 條選取的邊將 A,C,D,E,F,H,IA,C,D,E,F,H,I 連成一個連通分量;(A,B)(A,B) 再將 BB 加入。

最小生成樹總權重為:

2+14+15+16+19+20+30=1162+14+15+16+19+20+30=116

Prim 演算法

🔒

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

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

免費註冊

第 8 題5 分

A problem called "Edit Distance" is defined as: Given two strings str1 and str2; edit operations: Insertion, Deletion and Substitution. We can use dynamic programming to find minimum number of operations required to convert str1 to str2. The definitions of operations are as follows:
Insertion: insert a new character
Deletion: delete a character
Substitution: replace on character by another

Please write the recursive formula. (5%)
Given str1 = INTENTION and str2 = EXECUTION, use the above recursive formula to calculation an edit distance. (5%)

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

這一題的完整詳解

核心觀念

本題考查編輯距離(Edit Distance),又稱 Levenshtein Distance。給定兩字串,允許使用三種編輯操作:

  • 插入(Insertion):插入一個字元,成本為 11。
  • 刪除(Deletion):刪除一個字元,成本為 11。
  • 替換(Substitution):將一個字元替換成另一個字元,成本為 11。
  • 若兩字元相同,直接保留,成本為 00。

令 D(i,j)D(i,j) 表示將 str1 的前 ii 個字元轉換成 str2 的前 jj 個字元所需的最少操作次數。


解題方法:動態規劃遞迴公式

設 str1[i] 與 str2[j] 分別為目前考慮的最後一個字元,定義:

cost(i,j)={0,若 str1[i]=str2[j]1,若 str1[i]≠str2[j]cost(i,j)= \begin{cases} 0, & \text{若 } str1[i]=str2[j] \\ 1, & \text{若 } str1[i]\ne str2[j] \end{cases}

邊界條件

若其中一個字串為空字串:

D(0,j)=jD(0,j)=j

表示需要插入 jj 個字元。

D(i,0)=iD(i,0)=i

表示需要刪除 ii 個字元。

遞迴公式

當 i>0i>0 且 j>0j>0 時,最後一步有三種可能:

  1. 刪除 str1 的最後一個字元:D(i−1,j)+1D(i-1,j)+1
  2. 插入 str2 的最後一個字元:D(i,j−1)+1D(i,j-1)+1
  3. 保留或替換最後一個字元:D(i−1,j−1)+cost(i,j)D(i-1,j-1)+cost(i,j)

因此:

D(i,j)=min⁡{D(i−1,j)+1D(i,j−1)+1D(i−1,j−1)+cost(i,j)D(i,j)=\min \begin{cases} D(i-1,j)+1 \\ D(i,j-1)+1 \\ D(i-1,j-1)+cost(i,j) \end{cases}

若兩字元相同,第三項就是不做任何編輯;若不同,第三項代表替換。


計算 INTENTION 到 EXECUTION

令:

  • str1 = INTENTION
  • str2 = EXECUTION

兩字串長度皆為 99。

使用上述遞迴公式建立動態規劃表。列表示 INTENTION 的前綴,欄表示 EXECUTION 的前綴:

D(i,j)D(i,j)空字串EXECUTION
空字串0123456789
I1122345678
N2223456787
🔒

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

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

免費註冊

第 9 題10 分

Step by step to build the Huffman Code tree and list Huffman codes for all characters as the following alphabets and their frequencies: [A:5, B:12, C:33, D:19, E:40, F:41]. (10%)

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

這一題的完整詳解

核心觀念

Huffman 編碼(Huffman Coding) 是一種貪婪演算法(Greedy Algorithm)。建樹時每次選擇權重(頻率)最小的兩個節點合併,直到形成單一樹根。慣例設定左分支編碼為 0、右分支編碼為 1。


建樹步驟(Step-by-Step)

初始節點集合:{A:5,B:12,D:19,C:33,E:40,F:41}\{A:5, B:12, D:19, C:33, E:40, F:41\}

  1. 合併最小兩節點 A(5)A(5) 與 B(12)B(12):

    • 建立內部節點 n1=5+12=17n_1 = 5 + 12 = 17(左子樹 AA,右子樹 BB)。
    • 剩餘集合:{n1:17,D:19,C:33,E:40,F:41}\{n_1:17, D:19, C:33, E:40, F:41\}
  2. 合併最小兩節點 n1(17)n_1(17) 與 D(19)D(19):

    • 建立內部節點 n2=17+19=36n_2 = 17 + 19 = 36(左子樹 n1n_1,右子樹 DD)。
    • 剩餘集合:{C:33,n2:36,E:40,F:41}\{C:33, n_2:36, E:40, F:41\}
  3. 合併最小兩節點 C(33)C(33) 與 n2(36)n_2(36):

    • 建立內部節點 n3=33+36=69n_3 = 33 + 36 = 69(左子樹 CC,右子樹 n2n_2)。
    • 剩餘集合:{E:40,F:41,n3:69}\{E:40, F:41, n_3:69\}
  4. 合併最小兩節點 E(40)E(40) 與 F(41)F(41):

    • 建立內部節點 n4=40+41=81n_4 = 40 + 41 = 81(左子樹 EE,右子樹 FF)。
🔒

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

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

免費註冊

其他考古題