111 年 國立成功大學工程科學系碩士班乙組《資料結構》
第 1 題10 分
Rank the following functions by order of growth; that is, give an ordered list of the functions satisfying , , and so on. Partition your list into equivalence classes using brackets, e.g. , , such that and are in the same class if and only if .
Please explain your answer.
The functions are: , , , , , , , .
登入後即可作答並保存紀錄。
解題要點
- 以 為底 的對數寫成 。
- 斯特林公式 ⇒
- 代數恆等式:.
- 觀察指數與多項式的相對成長:
因為 .
5. 階乘 優於任何固定底數的指數 ,而 的指數為 ,仍屬於多項式級別的上界。
等價類與遞減序列
第 2 題10 分
Please derive the corresponding time complexity (Big - Oh) for each of the following program segments.
(1)
k = 0;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
k++;
(2)
k = 0;
for (i = 0; i < N; i++)
for (j = 0; j < i*i; j++)
for (z = 0; z < j; z++)
k++;
登入後即可作答並保存紀錄。
核心觀念
本題旨在考驗對**程式碼時間複雜度(Time Complexity)與大 漸進符號(Big-Oh Notation)**的分析能力,核心在於將多重迴圈(Nested Loops)的執行次數轉換為數學級數(Summation),並找出其最高階項(Dominant Term)。
所使用到的核心數學公式與工具如下:
- 等差級數求和公式:
- 高次次方和之漸進數量級估算(利用定積分估計法):
對於任意正整數 :
其最高次項係數可由積分求得:
解題方法
(1) 第一小題推導
程式碼片段:
k = 0;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
k++;
-
迴圈結構分析:
- 外層迴圈
i自 執行至 ,共執行 次。 - 內層迴圈
j自 執行至 ,共執行 次。 - 兩層迴圈之變數相互獨立,內層執行次數不隨
i的改變而變化。
- 外層迴圈
-
數學公式推導:
基本指令k++的總執行次數 為:
-
漸進複雜度判定:
(2) 第二小題推導
程式碼片段:
k = 0;
for (i = 0; i < N; i++)
for (j = 0; j < i*i; j++)
for (z = 0; z < j; z++)
k++;
-
迴圈結構與相依性分析:
- 外層迴圈: 從 到 。
- 中層迴圈: 從 到 (上限受 控制)。
- 內層迴圈: 從 到 (上限受 控制)。
-
由內而外推導執行次數:
- 最內層 ( 迴圈):在固定 的情況下,
z從 變到 ,基本指令k++共執行 次。 - 中層 ( 迴圈):在固定 的情況下,將最內層執行次數對 進行累加( 由 至 ):
- 最內層 ( 迴圈):在固定 的情況下,
第 3 題10 分
What is an optimal Huffman code for the following set of frequencies:
a:25, b:3, c:12, d:16, e:39, f:5, g:13.
登入後即可作答並保存紀錄。
Huffman 編碼構造步驟
| 步驟 | 合併對象 (頻率) | 產生新節點頻率 |
|---|---|---|
| 1 | 、 | |
| 2 | 、 | |
| 3 | 、 | |
| 4 | 、 | |
| 5 | 、 | |
| 6 | 、 | (根) |
位元分配(左子 0、右子 1)
- 根左子 → 前綴 0,右子 → 前綴 1
第 4 題10 分
Consider inserting the keys 12,15,3,35,21,42 and 14 in order into each of the following data structures.
Initially the tree is empty. Draw the resulting tree.
(1) Binary search Tree
(2) Balanced Search Tree
登入後即可作答並保存紀錄。
【答案】
- Binary Search Tree
12
/ \
3 15
/ \
14 35
/ \
21 42
第 5 題10 分
Consider the following graph G:
🖼️【此處有附圖,請對照原卷】
(a) Starting from node g, what is the depth-first traversal sequence of G?
(b) Starting from node g, what is the breadth-first traversal sequence of G?
登入後即可作答並保存紀錄。
核心觀念
深度優先搜尋(DFS)會沿著尚未拜訪的鄰點一路前進,走到沒有未拜訪鄰點時才回溯;廣度優先搜尋(BFS)則用佇列,依距離起點的層次逐層拜訪。兩者都在拜訪頂點時標記,避免重複拜訪。
解題方法
圖中有 至 共 9 個頂點,邊沒有箭頭,因此視為無向圖。依原圖讀得下列鄰接關係;遇到多個尚未拜訪的鄰點時,依題目註記選字典序最小者。
| 頂點 | 鄰點(字典序排列) |
|---|---|
**(a) DFS:**從 開始,先選 ,再由 選 ,接著依序走到 、、、。 的鄰點都已拜訪,因此開始回溯;回到 時, 仍未拜訪,於是由 走到 ,再走到 。
因此拜訪順序為
第 6 題10 分
Ackerman's function A(m, n) is defined as below:
(1) What is the value of A(2, 1)?
(2) Write a recursive program to calculate A(m, n).
登入後即可作答並保存紀錄。
核心觀念
本題考查資料結構與演算法中的核心觀念:遞迴(Recursion)與阿克曼函數(Ackermann's Function)。
-
阿克曼函數(Ackermann's Function):
阿克曼函數是一個極具代表性的非原始遞迴函數(Non-primitive Recursive Function)。它的成長速度極快,常用於測試電腦程式語言的遞迴處理能力、堆疊(Stack)深度上限,以及演算法的時間與空間複雜度分析。 -
遞迴三大要素:
解遞迴問題時必須明確定義:- 基本情況(Base Case):當 時,函數直接返回 ,不再進行遞迴呼叫。
- 遞迴步驟(Recursive Step):
- 當 且 時,將參數轉化為 。
- 當 且 時,採用雙重遞迴,將內部求解 的結果作為外層 的第二個參數。
- 收斂性(Convergence):每次遞迴呼叫時, 的字典序(Lexicographical order)均會嚴格遞減,確保最終必定能在有限步驟內到達 的基本情況。
解題方法
(1) 計算 之值
採用「由外向內拆解、由內向外回推」的代換法(Substitution Method)進行逐步推導:
-
展開主式 :
根據定義中 的規則:
-
求解內層 :
根據定義中 的規則:
-
求解 :
根據定義中 的規則:
-
求解 與基底代入:
- 代回 :
-
求解 之結果:
由步驟 2 與步驟 4 可得:
-
求解 :
將 代回步驟 1 的 :- 先求
- 因此
-
得出最終結果:
(2) 撰寫計算 的遞迴程式
採用 C/C++ 語言撰寫對應阿克曼函數數學定義的遞迴函式:
第 7 題10 分
(1) Explain what the best case situation is for Quicksort. What is the running time for this case and how do you arrive at this running time?
(2) Explain what the worst case situation is for Quicksort. What is the running time for this case and how do you arrive at this running time?
登入後即可作答並保存紀錄。
核心觀念
Quicksort 的執行時間取決於每次 partition 選出的 pivot 是否能將資料分割均勻。
對含有 個元素的陣列:
partition必須掃描元素一次,因此分割成本為 。- 分割後,pivot 本身已位於最終位置,不必再處理。
- 遞迴時間可用遞迴式分析。
一般形式為:
其中 是 pivot 左側的元素數量。
解題方法
判斷 Quicksort 的最佳與最差情況,關鍵在於觀察每次 partition 後,左右子問題的大小:
- 子問題大小接近一半:遞迴樹高度最小,為最佳情況。
- 一側沒有元素,另一側包含幾乎全部元素:遞迴樹高度最大,為最差情況。
(1)Quicksort 的最佳情況
情況說明
最佳情況發生在每次選出的 pivot 都接近目前資料的中位數,使 partition 後的兩個子陣列大小盡量平均。
若 為偶數,可近似分成:
因此遞迴式可寫成:
忽略常數與小數點差異即可進行漸進分析。
遞迴樹分析
第一層的 partition 成本為:
下一層共有兩個子問題,每個大小約為 ,總 partition 成本為:
再下一層共有四個子問題,每個大小約為 ,總成本仍為:
每一層的總成本皆為 。
由於每次問題大小約減半,遞迴樹高度為:
所以總執行時間為:
因此:
最佳情況下,Quicksort 的時間複雜度為 ,且其漸進下界也是 。
(2)Quicksort 的最差情況
情況說明
最差情況發生在每次選出的 pivot 都是目前資料中的最小值或最大值,使 partition 後:
- 一側子陣列大小為 ;
- 另一側子陣列大小為 。
例如 pivot 每次都是最小值,遞迴式為:
由於 ,可簡化為:
展開遞迴式
將遞迴式逐步展開:
第 8 題10 分
Which data structure is most suitable for implementing a complete binary tree and why?
登入後即可作答並保存紀錄。
核心觀念
本題考查 完全二元樹(Complete Binary Tree) 的定義及其在 記憶體中的表示法(Representation)。
- 完全二元樹(Complete Binary Tree)的定義:
若一棵二元樹的高度為 ,除了第 層外,其餘第 至 層的節點數均達到最大值(即滿二元樹);且第 層的所有節點必須由左至右連續排列,中間不允許有任何空缺(Gap)。 - 樹的儲存結構:
二元樹主要有兩種實作方式:- 連續儲存(Sequential Representation):使用一維陣列(Array)。
- 鏈結儲存(Linked Representation):使用雙向指標的鏈結串列(Linked List)。
解題方法
最適合實作完全二元樹的資料結構是 一維陣列(Array)。
原因說明與推導
-
空間利用率極高(Zero Space Overhead):
一般的二元樹若採用陣列儲存,可能因節點分佈不均勻而需填入大量無效的空節點(NIL/Dummy Nodes),造成記憶體浪費;但完全二元樹在按層序(Level-Order)由左至右編號時,節點恰好連續填滿陣列的前 個位置,完全不會浪費任何陣列空間。此外,陣列不需要像指標鏈結串列一樣額外為每個節點維護左右子節點指標(Pointer Overhead),節省了記憶體負擔。 -
父子節點索引計算極快( Index Arithmetic):
設完全二元樹共有 個節點,並將節點按層序編號存入一維陣列。以 1-based 索引(陣列第一個元素位於 Index 1)為例:- 對於位於索引 的節點:
- 其 父節點(Parent) 位於索引:
- 其 左子節點(Left Child) 位於索引(若 ):
- 其 右子節點(Right Child) 位於索引(若 ):
- 其 父節點(Parent) 位於索引:
- 對於位於索引 的節點:
第 9 題10 分
Please draw the tree after 507 and 520 are inserted into the following B-tree of order 5.
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
本題考驗 5 階 B 樹(B-tree of order 5) 的鍵值(Key)插入與溢位分裂(Split)機制。
對於階數為 的 B 樹(本題 ),其必須遵循以下結構規範與操作定義:
- 節點容量限制:
- 鍵值上限:任一節點最多容納 個鍵值。
- 子節點上限:任一節點最多擁有 個子樹(Child Pointers)。
- 鍵值下限:除根節點(Root)外,其餘非葉節點與葉節點至少需包含 個鍵值。
- 深度平衡:所有葉節點(Leaf Nodes)必須位於相同的深度(Level)。
- 插入與分裂法則:
- 任何新鍵值必定先搜尋並插入至對應的葉節點中。
- 若插入後該葉節點的鍵值數量達到 個,即發生溢位(Overflow)。
- 發生溢位時,將節點內的 5 個鍵值由小到大排序,取位於正中間(第 個)的鍵值作為**中位數(Median Key)向上提升(Promote)**至父節點;左側 2 個較小鍵值與右側 2 個較大鍵值則分別分裂為兩個全新的子節點。
- 若父節點接收提升的鍵值後亦發生溢位,則依相同法則向上一路連鎖分裂(Cascading Split),直至樹高增加或符合規範為止。
解題方法
本題給定之原始 5 階 B 樹結構如下:
- 根節點:
- 葉節點 1(鍵值 ):
- 葉節點 2(鍵值介於 ):
- 葉節點 3(鍵值介於 ):
- 葉節點 4(鍵值 ):
依照題目要求,依序執行 與 之插入推導:
步驟一:插入 507
- 尋找插入位置:由根節點開始比對,因 ,沿最右側指標尋找到葉節點 4:。
- 寫入鍵值:將 插入該葉節點,保持遞增順序,節點鍵值更新為 。
- 容量檢查:此時該節點包含 4 個鍵值,符合上限規範 ,未發生溢位,無須進行分裂。
步驟二:插入 520
- 尋找插入位置:同樣經由根節點比對(),定位至最右側葉節點 。
- 寫入鍵值:將 插入該葉節點,鍵值更新為 。
- 容量檢查與分裂:
- 節點內鍵值數量達到 5 個(),觸發溢位(Overflow)。
- 排序後的 5 個鍵值為:。
- 取第 3 個鍵值 作為中位數提升至父節點(根節點)。
- 左側鍵值 留在原葉節點;右側鍵值 拆分為獨立的新葉節點。
- 更新父節點(根節點):
- 根節點接收提升的鍵值 ,鍵值由 更新為 。
第 10 題10 分
For the AOE(Activity On Edge) network given below:
🖼️【此處有附圖,請對照原卷】
(a) Obtain the earliest starting time and latest starting time for each activity.
(b) Determine the critical path of the project.
(c) Is there any single activity whose speed up would result in reduction of the project length?
登入後即可作答並保存紀錄。
核心觀念
AOE 網路中:
- 頂點代表事件,邊代表活動。
- 活動 的工期為 。
- 最早開始時間:
- 最晚開始時間:
其中:
- :事件 的最早發生時間。
- :事件 的最晚發生時間。
- 的活動為關鍵活動,所有關鍵活動組成關鍵路徑。
解題方法
依照箭頭方向先做 forward pass,求出各事件的最早時間:
再由終點反向做 backward pass,求出各事件的最晚時間:
由圖可讀得活動如下:
| 活動 | 工期 |
|---|---|
| 5 | |
| 6 | |
| 3 | |
| 6 | |
| 3 | |
| 3 | |
| 4 | |
| 4 | |
| 1 | |
| 4 | |
| 5 | |
| 2 | |
| 4 | |
| 2 |
1. Forward pass:事件最早時間
因此,專案最短工期為 。
2. Backward pass:事件最晚時間
終點事件的最晚時間等於專案工期:
接著反向計算:
(a) 各活動的最早與最晚開始時間
對每個活動 :