115 年 國立成功大學工程科學系碩士班乙組《資料結構》
第 1 題20 分
Consider the following pseudocode:
Z=n
for x = 1 to n do
for i = 1 to x do
for j = 1 to x do
if (i != j) then
Z++;
end if
end
end
end
Assume that n is a positive integer and that the variable Z is initially set to n.
The statement Z++ increases the value of Z by 1 each time it is executed.
Question:
Using n as the variable, determine the final value of Z after the algorithm terminates. Your answer should be expressed as a closed-form formula in terms of n.
登入後即可作答並保存紀錄。
核心觀念
本題旨在考驗**演算法分析(Algorithm Analysis)中的迴圈計數(Loop Counting)與離散數學的級數求和(Summation Series)**技巧。
解題時需要掌握以下核心要素:
- 補集計數法(Complement Counting):在固定上限的雙重迴圈中,求 的組合數,可利用「總組合數 」扣除「 的組合數 」。
- 級數求和公式:
- 一次方和(等差級數):
- 平方和公式:
- 變數累加特性:變數 的最終值等於「初始值」加上「敘述
Z++被執行的總次數」。
解題方法
步驟一:分析內層迴圈的執行次數
當最外層迴圈變數 為定值時, 與 的取值範圍皆為 :
- 與 產生的所有二元對 總數為 種。
- 其中條件 的組合共有 種(分別為 )。
- 因此,滿足條件
if (i != j)的二元對個數為:
即對於給定的 ,敘述 Z++ 會被執行 次。
步驟二:累加外層迴圈獲得總增加量
最外層迴圈 從 迭代至 ,故整個演算法中 Z++ 的總執行次數為:
代入標準級數求和公式:
提出公因式 進行通分與化簡:
第 2 題20 分
Consider a discrete memoryless source that emits the following symbols with distinct, positive frequencies:
| Symbol | A | B | C | D | E | F |
|---|---|---|---|---|---|---|
| Frequency | 4 | 7 | 10 | 15 | 20 | 45 |
(a). (10%) Compute the Weighted Path Length (WPL) of the resulting Huffman Tree.
(b). (10%) Let denote the average codeword length of the Huffman code. Compute and round your answer to three decimal places.
登入後即可作答並保存紀錄。
核心觀念
- 霍夫曼編碼 (Huffman Coding):
霍夫曼編碼是一種基於字元出現頻率(或機率)構建最佳前綴碼(Prefix Code)的貪婪演算法(Greedy Algorithm)。出現頻率越高的字元,其編碼長度越短,從而達到資料壓縮的效果。 - 帶權路徑長度 (Weighted Path Length, WPL):
對於一棵擴充二元樹(Extended Binary Tree),其外部節點(葉節點)代表各字元。加權路徑長度 定義為所有葉節點的權重(頻率 )與其從根節點到該葉節點的路徑長度(深度 )的乘積之和:
此外,根據霍夫曼樹的性質, 亦等於所有內部節點(Internal Nodes)權重之總和。 - 平均字碼長度 ():
平均字碼長度代表傳輸每一個符號平均需要的位元數(Bits/Symbol),計算公式為總帶權路徑長度除以所有符號的總頻率:
其中 為資料源總頻率。
解題方法
第一步:構建霍夫曼樹 (Huffman Tree Construction)
將給定之符號與頻率依頻率由小到大排序並存入最小優先佇列(Min-Heap):
每次選取頻率最小的兩個節點合併為一個新的內部節點,重複此步驟直至只剩下一個根節點:
- 合併 與 :
- 建立內部節點
- 剩餘節點:
- 合併 與 :
- 建立內部節點
- 剩餘節點:
- 合併 與 :
- 建立內部節點
- 剩餘節點:
- 合併 與 :
- 建立內部節點
- 剩餘節點:
- 合併 與 :
- 建立根節點
- 完成霍夫曼樹構建,總頻率 。
(a) 計算霍夫曼樹的加權路徑長度 (WPL)
第 3 題20 分
Consider the following list of distinct integers:
[50,30,70,20,40,60,80]
The list represents the order in which elements are inserted into an initially empty Binary Search Tree (BST) using the standard BST insertion rule.
(a). (5%) Please construct a Binary Search Tree from the list.
(b). (15%) What are the pre-order, in-order, and post-order traversals of your tree for Question (a)? Please write down the sequences of the numbers.
登入後即可作答並保存紀錄。
核心觀念
本題旨在評量**二元搜尋樹(Binary Search Tree, BST)的基本建構規則以及三種常見的樹的走訪(Tree Traversals)**演算法。
-
二元搜尋樹(BST)之定義與插入規則:
對於 BST 中的任意節點 :- 若其左子樹存在,則左子樹中所有節點的值皆小於 的值。
- 若其右子樹存在,則右子樹中所有節點的值皆大於 的值。
- 插入新元素 時,自根節點開始比對:若 則往左子樹遞迴搜尋;若 則往右子樹遞迴搜尋;直至找到適當的空位(
null處)建立新節點。
-
樹走訪(Tree Traversals)演算法:
- 前序走訪(Pre-order Traversal):走訪順序為 根節點(V) 左子樹(L) 右子樹(R)。
- 中序走訪(In-order Traversal):走訪順序為 左子樹(L) 根節點(V) 右子樹(R)。
- 後序走訪(Post-order Traversal):走訪順序為 左子樹(L) 右子樹(R) 根節點(V)。
解題方法
(a) 逐一插入建構二元搜尋樹(BST)
給定插入序列:
- 插入 50:樹為空,直接作為根節點(Root)。
- 插入 30:,成為 的左子節點。
- 插入 70:,成為 的右子節點。
- 插入 20: 往左走; 往左走,成為 的左子節點。
- 插入 40: 往左走; 往右走,成為 的右子節點。
- 插入 60: 往右走; 往左走,成為 的左子節點。
- 插入 80: 往右走; 往右走,成為 的右子節點。
建構完成之二元搜尋樹如下圖所示:
50
/ \
30 70
/ \ / \
20 40 60 80
(b) 推導三種走訪序列(Pre-order, In-order, Post-order)
根據子樹結構進行遞迴追蹤:
- Pre-order Traversal(前序走訪:根 左 右):
- 拜訪根節點 。
- 拜訪左子樹(根為 ):拜訪根 左子節點 右子節點 (序列:
30, 20, 40)。 - 拜訪右子樹(根為 ):拜訪根 左子節點 右子節點 (序列:
70, 60, 80)。
第 4 題20 分
Consider the following sorting algorithms:
- Bubble Sort
- Selection Sort
- Insertion Sort
- Merge Sort
- Quick Sort
- Heap Sort
(a). (12%) Indicate which of the above sorting algorithms are unstable.
(b). (8%) Among the sorting algorithms identified as unstable in part (a), indicate the algorithm(s) that have the best worst-case time complexity.
登入後即可作答並保存紀錄。
核心觀念
-
排序演算法的穩定度(Stability)
- 定義:若待排序資料中存在鍵值(Key)相同的元素(例如 且原順序 ),經排序過後, 依然排在 前面,則稱該排序演算法為穩定(Stable);反之,若相同鍵值元素的相對前後順序可能改變,則稱為不穩定(Unstable)。
- 本質判斷:演算法在運作過程中是否包含「長距離/跨越式交換(Long-distance Swap)」或破壞相對位置的結構調整(如 Heap 下沉操作)。
-
最壞時間複雜度(Worst-case Time Complexity)
- 指演算法在最不利的輸入資料分佈下,執行步驟數量的漸進上限(Asymptotic Upper Bound),以 Big- 記號表示。
解題方法
- (a) 子題:針對題目列出的 6 種排序演算法(Bubble Sort、Selection Sort、Insertion Sort、Merge Sort、Quick Sort、Heap Sort),分析各自的元素搬移與交換機制,區分出穩定與不穩定的演算法。
- (b) 子題:將 (a) 中判定為「不穩定」的演算法取出,列出各自在最壞情況下的時間複雜度,經由漸進成長率比較,選出表現最佳者(時間複雜度最快者)。
選項分析
針對題目給定的 6 種排序演算法逐一說明穩定度與最壞時間複雜度:
-
Bubble Sort(氣泡排序)
- 穩定度:穩定(Stable)。僅在相鄰元素滿足嚴格大於關係()時才進行交換,相等元素不會交換位置,相對順序不變。
- 最壞時間複雜度:。
-
Selection Sort(選擇排序)
- 穩定度:不穩定(Unstable)。每輪尋找未排序區間的最小值後,將其與未排序區間的第一個元素進行長距離交換。
- 反例說明:對數列 進行升冪排序,第一輪找到最小值 ,將其與第一個元素 交換,數列變為 。此時 與 的相對順序倒置。
- 最壞時間複雜度:。
-
Insertion Sort(插入排序)
- 穩定度:穩定(Stable)。未排序元素由後往前插入已排序區間時,若遇到相同鍵值的元素即停止搜尋並插入其右側,確保相對順序不變。
- 最壞時間複雜度:。
-
Merge Sort(合併排序)
- 穩定度:穩定(Stable)。在合併(Merge)兩個已排序子陣列時,若左右兩側元素鍵值相等,實作上規定優先取左側子陣列元素進入結果陣列,即可維護相對順序。
- 最壞時間複雜度:。
第 5 題20 分
Consider the following directed weighted graph with vertices.
🖼️【此處有附圖,請對照原卷】
(圖中節點為 A, B, C, D, E, F, G, H, I,邊及其權重如下:
A->B (4), A->D (2)
B->C (6), B->E (1)
C->F (2)
D->E (8)
E->C (5), E->F (4), E->H (1)
F->I (2)
G->D (2), G->H (3)
H->I (5)
)
(a). (5%) Determine the shortest path from vertex A to vertex H.
(b). (15%) Based on your answer in part (a), determine the total cost (sum of edge weights) of the shortest path.
登入後即可作答並保存紀錄。
核心觀念
這題考有向加權圖的最短路徑。路徑成本是沿途邊權重總和;由於圖中邊權重皆為非負數,可用 Dijkstra 演算法逐步確定各頂點從起點 出發的最短距離。
依原圖,會影響本題的邊包括 權重 、 權重 、 權重 。圖上的方向與權重須依箭頭判讀。
解題方法
從 開始,記錄目前已知的最短距離 ,每次選取距離最小且尚未確定的頂點,並用它更新相鄰頂點:
| 確定的頂點 | 更新結果 |
|---|---|
| ;; |