115 年 國立臺北大學資訊工程研究所《資料結構與演算法》
第 1 題10 分
Please convert the infix expression: into postfix notation and draw the corresponding binary expression tree.
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 中序表示法(infix notation)
- 後序表示法(postfix notation)
- 運算子優先順序與結合性
- 二元運算式樹(binary expression tree)
原式為:
括號先計算,乘法優先於加法,因此實際結構為:
後序表示法的規則是:
- 先處理左子運算式。
- 再處理右子運算式。
- 最後輸出目前運算子的符號。
因此,二元運算式樹的後序走訪結果就是 postfix notation。
解題方法
左半部
左半部為:
其中:
再將結果與 進行乘法:
右半部
右半部為:
先處理兩個括號:
再進行乘法:
合併左右子運算式
整個式子的最外層運算子是加法,因此最後輸出 :
轉換為:
第 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: .
登入後即可作答並保存紀錄。
核心觀念
BST(Binary Search Tree,二元搜尋樹)滿足:
- 任一節點左子樹的鍵值皆小於該節點。
- 任一節點右子樹的鍵值皆大於該節點。
- Postorder traversal(後序走訪)順序為:
因此,後序序列的最後一個元素必為整棵 BST 的根節點。假設所有鍵值皆不重複,BST 可由後序序列唯一決定。
解題方法
給定後序序列:
1. 決定根節點
最後一個元素為 ,所以根節點是 。
將其餘元素依照大小分成左右子樹:
- 小於 :,屬於左子樹
- 大於 :,屬於右子樹
因此:
2. 建立左子樹
左子樹的後序序列為:
最後一個元素為 ,所以左子樹根節點為 。
依照 分割:
- 小於 :
- 大於 :
所以 的左子樹後序序列為 ,右子樹為 。
對 而言,最後一個元素 為根節點;,因此 為 的左子節點。
第 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)後,若某元素 為該次採用的樞紐(Pivot),則該元素必須滿足以下兩項條件:
- 不小於左側所有元素:
- 不大於右側所有元素:
即該 Pivot 已經被安置於陣列最終排序完成後的正確位置上。
關鍵推導
給定陣列 (共 10 個元素),逐一檢驗各位置是否符合 Pivot 條件:
| 索引 | 元素 | 左側最大值 | 右側最小值 | 是否可為 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)的插入與刪除最大值操作。
最大堆積必須同時符合:
- 完全二元樹:除最後一層外,每層皆填滿,最後一層由左至右排列。
- 最大堆積性質:每個節點的值都不小於其子節點,即
最大堆積通常以陣列儲存:
- 插入:將新元素放在陣列最後,再向上調整(bubble up)。
- Extract-Max:移除根節點,將最後一個元素移至根,再向下調整(heapify down)。
解題方法
依序執行 8 個操作,並以陣列表示當下的最大堆積。
1. Insert 8
插入後:
樹狀結構:
8
2. Insert 4
先將 4 放在最後,再與父節點 8 比較。因為 ,不需調整。
8
/
4
3. Insert 9
先放在陣列最後:
9 的父節點為 8,因為 ,交換:
9
/ \
4 8
4. Insert 6
先放在最後:
6 的父節點為 4,因為 ,交換:
9
/ \
6 8
/
4
5. Extract-Max
移除根節點 9,將最後一個元素 4 移至根:
此時 4 的子節點為 6 與 8,最大子節點為 8。因為 ,交換:
8
/ \
6 4
6. Insert 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。)
登入後即可作答並保存紀錄。
核心觀念
AVL 樹要求每個節點的左右子樹高度差至多為 。定義平衡因子為
插入後若某節點的平衡因子變成 或 ,就要依插入方向判斷旋轉類型。本題會依序用到 LL 單旋與 LR 雙旋。
解題方法
原始樹為:
15
/ \
10 25
/
5
插入鍵值 2
依二元搜尋樹規則,、、,因此插入為 的左子節點:
15
/ \
10 25
/
5
/
2
節點 的左子樹比右子樹高 ,而新節點位於左子節點的左側,屬於 LL 型。以 為軸向右旋轉,得到:
15
/ \
5 25
/ \
2 10
插入鍵值 8
從目前的樹搜尋:、、,因此插入為 的左子節點:
第 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
)
登入後即可作答並保存紀錄。
核心觀念
Dijkstra 演算法用來求非負權重圖中,起點到各節點的最短距離。每一步從尚未確定的節點中,選取目前暫定距離最小者,將其距離確定,再用它更新相鄰節點:
其中 是起點 到節點 的暫定距離, 是邊 的權重。
解題方法
初始化 ,其餘節點距離為 。從 出發,暫定距離為 的 同距;同距時處理順序可以不同,不影響最短距離。
| 確定節點 | 距離 | 更新後的暫定距離 |
|---|---|---|
| ;經 到 為 ,不優於 | ||
| ;經 到 為 ,不優於 | ||
| 經 到 ,皆不優於現有距離 |
第 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
)
登入後即可作答並保存紀錄。
核心觀念
最小生成樹(MST)必須連接圖中的所有頂點、不可形成迴圈,且總權重最小。這張圖有 8 個頂點,因此任何生成樹都恰有 條邊。
- Kruskal 演算法:依權重由小到大檢查邊;若加入該邊不會形成迴圈,就選取。
- Prim 演算法:從一個頂點開始,每次選擇連接「已加入樹中的頂點」與「樹外頂點」的最小權重邊。
Kruskal 演算法
將邊依權重遞增排列,逐一檢查:
| 權重 | 邊 | 處理結果 |
|---|---|---|
| 2 | 選取 | |
| 14 | 選取 | |
| 15 | 選取 | |
| 16 | 選取 | |
| 19 | 選取 | |
| 20 | 選取 | |
| 21 | 略過;會形成迴圈 | |
| 23 | 略過;會形成迴圈 | |
| 24 | 略過;會形成迴圈 | |
| 25 | 略過;會形成迴圈 | |
| 26 | 略過;會形成迴圈 | |
| 30 | 選取,連入頂點 |
選取 後,8 個頂點已全部連通,且共選了 7 條邊,因此演算法完成。前 6 條選取的邊將 連成一個連通分量; 再將 加入。
最小生成樹總權重為:
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):插入一個字元,成本為 。
- 刪除(Deletion):刪除一個字元,成本為 。
- 替換(Substitution):將一個字元替換成另一個字元,成本為 。
- 若兩字元相同,直接保留,成本為 。
令 表示將 str1 的前 個字元轉換成 str2 的前 個字元所需的最少操作次數。
解題方法:動態規劃遞迴公式
設 str1[i] 與 str2[j] 分別為目前考慮的最後一個字元,定義:
邊界條件
若其中一個字串為空字串:
表示需要插入 個字元。
表示需要刪除 個字元。
遞迴公式
當 且 時,最後一步有三種可能:
- 刪除
str1的最後一個字元: - 插入
str2的最後一個字元: - 保留或替換最後一個字元:
因此:
若兩字元相同,第三項就是不做任何編輯;若不同,第三項代表替換。
計算 INTENTION 到 EXECUTION
令:
str1 = INTENTIONstr2 = EXECUTION
兩字串長度皆為 。
使用上述遞迴公式建立動態規劃表。列表示 INTENTION 的前綴,欄表示 EXECUTION 的前綴:
| 空字串 | E | X | E | C | U | T | I | O | N | |
|---|---|---|---|---|---|---|---|---|---|---|
| 空字串 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| I | 1 | 1 | 2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| N | 2 | 2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 7 |
第 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)
初始節點集合:
-
合併最小兩節點 與 :
- 建立內部節點 (左子樹 ,右子樹 )。
- 剩餘集合:
-
合併最小兩節點 與 :
- 建立內部節點 (左子樹 ,右子樹 )。
- 剩餘集合:
-
合併最小兩節點 與 :
- 建立內部節點 (左子樹 ,右子樹 )。
- 剩餘集合:
-
合併最小兩節點 與 :
- 建立內部節點 (左子樹 ,右子樹 )。