113 年 國立中央大學資訊工程學系AI碩士班《資料結構與演算法》
第 1 題
Consider the graph above. Which of the following cannot be the edge selection sequence of Kruskal's minimum spanning
tree algorithm?
(A) (d, f) (a, b) (d, c) (b, f) (d, e)
(B) (d, f) (a, b) (b, f) (d, e) (d, c)
(C) (a, b) (d, f) (b, f) (f, c) (d, e)
(D) (a, b) (d, f) (d, c) (f, c) (d, e)
登入後即可作答並保存紀錄。
核心觀念
Kruskal 演算法依邊權重由小到大檢查邊;若一條邊連接兩個不同的連通分量,就選入生成樹,若會形成環就略過。權重相同的邊可任意排序。這張圖有 6 個頂點,因此最小生成樹須選入 5 條邊。
解題方法
圖中各邊權重為:、;、、;、;、;、。頁首標示本題為複選題;判斷各序列時,需同時檢查所選邊的權重順序,以及每條邊是否會形成環。
選項分析
-
(A) 可以。 先選 、,兩者權重均為 1。再依序選 、,兩者權重均為 2,且各自連接不同分量。最後選 ,權重為 3,將頂點 接入。整個序列權重不遞減,且沒有形成環。
-
(B) 不可以。 選入 、、 後, 仍與其他頂點分開。
第 2 題
Consider the following five sorting algorithms: Quick Sort, Heap Sort, Merge Sort, Insertion Sort and Radix Sort. Which
of the following statements are true?
(A) Insertion Sort gives best performance when applied on an array which is sorted or almost sorted (maximum 1 or two
elements are misplaced).
(B) Radix Sort is most efficient to sort string consisting of ASCII characters?
(C) All these five sorting algorithms are comparison based sorting algorithms.
(D) All these five sorting algorithms are stable.
登入後即可作答並保存紀錄。
核心觀念
本題考查常見五大排序演算法(Quick Sort、Heap Sort、Merge Sort、Insertion Sort、Radix Sort)之時間複雜度、**穩定性(Stability)以及比較型與非比較型排序(Comparison-based vs. Non-comparison based Sorting)**等核心性質。
關鍵定義與定理整理如下:
- 比較型排序的時間複雜度下界(Lower Bound for Comparison Sorts):
任何基於元素間比較(Comparison-based)的排序演算法,在最壞情況下的時間複雜度下界為 。 - 近乎排序(Nearly Sorted)資料之處理:
當資料中逆序對(Inversions)的數量為 或 時,Insertion Sort 的時間複雜度為 ,此時執行效能優於一般的 演算法。 - 穩定性(Stability):
排序後若鍵值(Key)相同的元素能保持其在原始陣列中的相對前後順序,則稱為穩定排序(Stable Sort)。- 穩定排序:Insertion Sort, Merge Sort, Radix Sort, Counting Sort, Bucket Sort。
- 不穩定排序:Quick Sort, Heap Sort, Selection Sort。
- 非比較型排序(Non-comparison Sorts):
Radix Sort 藉由將元素按位數(Digit/Character)分配至桶子(Buckets)來排序,不透過直接比較兩元素的大小關係,屬於非比較型排序。
解題方法
針對題目說明的五種排序演算法進行分類與性質分析:
| 排序演算法 | 最佳時間複雜度 | 最壞時間複雜度 | 空間複雜度 | 穩定性 (Stability) | 分類 (Comparison-based) |
|---|---|---|---|---|---|
| Quick Sort | 否 (Unstable) | 是 (Comparison-based) | |||
| Heap Sort | 否 (Unstable) | 是 (Comparison-based) | |||
| Merge Sort | 是 (Stable) | 是 (Comparison-based) | |||
| Insertion Sort | 是 (Stable) | 是 (Comparison-based) | |||
| Radix Sort | 是 (Stable) | 否 (Non-comparison) |
據此逐一核對選項 (A)、(B)、(C)、(D) 的敘述正確性。
選項分析
- (A) 正確。
Insertion Sort 的時間複雜度正比於陣列中「逆序對(Inversions)」的個數 ,總時間複雜度為 。
第 3 題
Which of the following statements are true? Let T(n) denote the time complexity of performing insertion in an n-element
Binary Search Tree.
(A) T(n) = 2T(n/2) + O(1) and T(1) = T(0) = O(1) holds for best case only.
(B) T(n) = T(n-1) + O(1) and T(1) = T(0) = O(1) holds for worst case only
(C) T(n) = T(n/2) + O(1) and T(1) = T(0) = O(1) holds for best case.
(D) T(n) = T(n-2) + O(1) and T(1) = T(0) = O(1) holds for worst case.
登入後即可作答並保存紀錄。
核心觀念
-
二元搜尋樹(Binary Search Tree, BST)之新增(Insertion)運算機制:
在二元搜尋樹中新增一個元素時,從根節點(Root)開始與待插入之鍵值進行比較:- 若待插入鍵值小於當前節點,走入左子樹。
- 若待插入鍵值大於當前節點,走入右子樹。
- 重複此過程直至找到對應的空指標位置()並建立新節點。
因此,新增操作在每個節點僅做一次常數時間 的比較與指針移動,且僅沿著從根節點至葉節點的單一走訪路徑(Single Path)向下深入,絕不會同時遞迴搜尋左右兩棵子樹。
-
樹形結構(Tree Topology)與遞迴關係式(Recurrence Relation):
- 最佳狀況(Best Case):樹型為完全平衡二元樹(Perfectly Balanced Tree)。根節點的左右子樹節點數量大致相等(規模各約為 )。每次比較後,搜尋範圍縮減為原本的一半,其時間複雜度遞迴式為:
根據主定理(Master Theorem)可解得 。 - 最差狀況(Worst Case):樹型嚴重傾斜退化為單向鏈結串列(Skewed Tree / Degenerate Tree),例如輸入序列已完全排序。每次比較僅能排除當前根節點,剩餘需搜尋的子樹規模縮減 (規模為 ),其時間複雜度遞迴式為:
經展開累加可解得 。
- 最佳狀況(Best Case):樹型為完全平衡二元樹(Perfectly Balanced Tree)。根節點的左右子樹節點數量大致相等(規模各約為 )。每次比較後,搜尋範圍縮減為原本的一半,其時間複雜度遞迴式為:
解題方法
分析二元搜尋樹新增運算複雜度的遞迴關係式時,應著眼於兩項關鍵參數:
- 遞迴項係數(Branching Factor):代表每次遞迴呼叫的次數。因為 BST 的新增只選擇左或右其中一條分支,故遞迴項係數必然為 。若係數為 (如 ),代表同時遍歷左右兩棵子樹(例如二元樹的走訪或分治法)。
- 規模縮減量(Subproblem Reduction Rate):
- 平衡樹(最佳狀況):每次將規模縮減一半()。
第 4 題
Which of the following are true for dynamic programming?
(A) The solution has optimal substructure
(B) Breaking a problem into smaller overlapping subproblems.
(C) Solving problems in a sequential manner.
(D) The time complexity of dynamic programming (with overlapping subproblems using memorization) is O(n²)
登入後即可作答並保存紀錄。
核心觀念
本題考查**動態規劃(Dynamic Programming, DP)**的基本定義、適用條件、求解順序及其時間複雜度特性。
動態規劃適用於解決具備以下兩大特性的最佳化問題:
- 最佳子結構(Optimal Substructure):原問題的最佳解可以由其子問題的最佳解組合而成。
- 重疊子問題(Overlapping Subproblems):在遞迴求解過程中,相同的子問題會重複出現,可透過記憶化(Memoization)或自底向上填表(Tabulation)將子問題解答儲存,避免重複計算。
在計算時間複雜度時,動態規劃演算法的時間複雜度通常可表示為:
解題方法
解題切入點為檢驗選項中關於動態規劃兩大核心要件(最佳子結構、重疊子問題)、求解順序特性以及複雜度一般性的描述:
- 對比動態規劃與分治法(Divide and Conquer):兩者皆具備最佳子結構,但動態規劃處理的是「重疊子問題」,分治法處理的是「獨立子問題」。
- 釐清求解順序:動態規劃起源於多階段決策過程(Sequential Decision Process),依據狀態依賴關聯圖(DAG)按順序(Sequential manner)由小狀態推進求解至大狀態。
- 分析複雜度泛用性:動態規劃的時間複雜度取決於具體問題的狀態空間與轉移代價,並不存在固定的 複雜度上限或下限。
選項分析
- (A) 正確
- 分析:動態規劃適用的必要條件之一即為「最佳子結構(Optimal Substructure)」。這代表問題的最佳解包含了其內部相關子問題的最佳解。若問題不具備最佳子結構,則無法透過組合子問題的最佳解來獲得整體最佳解。
- (B) 正確
- 分析:動態規劃的核心做法是將複雜問題分解為較小且彼此「重疊的子問題(Overlapping Subproblems)」。藉由將已計算過的子問題答案記錄在記憶體中(Memoization),下次再次遇到相同子問題時即可直接查表,避免重複計算。
- (C) 正確
第 5 題
Let LASTPOST, LASTIN and LASTPRE denote the last vertex visited in a postorder, inorder and preorder traversal,
respectively. Which of the following are true?
(A) LASTIN = LASTPOST of a complete binary tree.
(B) LASTIN = LASTPRE of a full binary tree
(C) LASTPRE = LASTPOST of a full binary tree
(D) LASTIN = LASTPRE of a complete binary tree
登入後即可作答並保存紀錄。
核心觀念
-
走訪順序(Traversals)之終點節點(Last Visited Node)定義
- 前序走訪(Preorder Traversal):順序為「根 左子樹 右子樹」。
- 若樹不為空,最後走訪的節點 會從根節點開始,優先走右分支;若某節點無右子樹則走左分支,直到抵達葉節點(Leaf Node)。
- 中序走訪(Inorder Traversal):順序為「左子樹 根 右子樹」。
- 最後走訪的節點 恆為整棵二元樹最右側的節點(Rightmost Node,即從根節點不斷往右子節點走到底的節點)。
- 後序走訪(Postorder Traversal):順序為「左子樹 右子樹 根」。
- 最後走訪的節點 恆為整棵二元樹的根節點(Root Node)。
- 前序走訪(Preorder Traversal):順序為「根 左子樹 右子樹」。
-
二元樹型態定義
- 滿二元樹(Full Binary Tree):
- 在標準資料結構教材(如 Horowitz)定義中,深度為 的滿二元樹擁有 個節點(即每一層皆填滿,亦稱 Perfect Binary Tree);另一常見定義為所有內部節點(Internal Node)皆恰有 2 個子節點(Strict / Proper Binary Tree)。在這兩種定義下,所有內部節點均同時具備左、右子節點。
- 完全二元樹(Complete Binary Tree):
- 若樹深為 ,則第 至 層皆填滿,且第 層的節點由左至右依序連續填入。
- 滿二元樹(Full Binary Tree):
解題方法
分析三種走訪最後走訪節點的通用結構特徵:
- 恆等於根節點 。
- 恆等於樹的最右側節點(從 出發一路向右走到底)。
- 為:從 開始,若有右子節點則走右邊,無右子節點但有左子節點則走左邊,直至到達葉節點。
對於 滿二元樹(Full Binary Tree):
由於所有非葉節點均含有右子節點,從根節點尋找 時,每一步均選擇走右子樹,最終抵達最右側葉節點;而 亦為一路往右走到底的最右側葉節點。因此在滿二元樹中, 與 必指向同一節點。
對於 完全二元樹(Complete Binary Tree):
當節點個數為特定數值(例如 )時,最右側子樹的內部節點可能僅有左子節點而無右子節點,導致 與 走訪順序不同,且兩者均不等於根節點 。
選項分析
- (A) 錯誤。
- 說明:在任何非空二元樹中, 恆為根節點。而對於節點數 的完全二元樹,根節點含有右子樹,中序走訪最後走訪的 在右子樹中,與根節點 不相等。
- 反例:設完全二元樹有 個節點(根節點為 ,左子節點為 ,右子節點為 )。
- 中序走訪順序:,故 。
第 6 題
Consider a complete graph G with vertex set {0, 1, 2, 3, 4}. Let W be the matrix of edge weights of G, e.g., entry Wij in
matrix W is the weight of edge {i, j}. What are the minimum possible cost of a spanning tree T of G?
W=
0 1 8 1 5
1 0 5 5 9
8 5 0 7 3
1 5 7 0 2
5 9 3 2 0
(A) 7 when vertex 0 is the root of T
(B) 8 when vertex 0 is not the root in T
(C) 9 when vertex 0 is a leaf node in T
(D) 10 when vertex 0 is a leaf node in T
登入後即可作答並保存紀錄。
核心觀念
本題考最小生成樹(MST)及「指定頂點為葉節點」的限制。
- 無向圖的邊 只有一個權重,因此權重矩陣必須滿足 。
- 生成樹的「根」只是指定走訪起點,不影響所選邊及總成本。
- 若要求頂點 為葉節點,則它的度數必須為 ,只能以一條邊接入其餘頂點形成的生成樹。
解題方法
原卷第 頁的矩陣確實寫成 、,以及 、;其餘對稱位置的數值一致。這兩組數值違反無向圖權重矩陣的對稱性,題目缺少一致的邊權重定義,以下分別列出以上三角、下三角為準的結果。
一、未限制頂點 為葉節點
兩種取法都有以下四條邊:
選取它們會形成一棵生成樹,連接關係為 ,成本為
這四個權重也是全圖最小的四個邊權重;任何五頂點生成樹都需要四條邊,因此成本至少為 ,上述生成樹已達到下界。
把這棵樹的根指定為 ,最低成本是 ;把根指定為其他頂點,最低成本仍是 。
二、限制頂點 為葉節點
刪除葉節點 及其唯一相接的邊後,剩下的四個頂點必須形成一棵生成樹。因此:
兩種取法中,頂點 的最便宜接入邊都是權重 的 或 。
第 7 題
Which of the following statements are true?
(A) AB+DEF/-BC+ is the postfix expression of A+B-DE/F+BC
(B) AB+DEF/BC-+ is the postfix expression of A+B-DE/F+BC
(C) ABDEF/+BC*+ is the postfix expression of A+BDE/F+BC
(D) ABDEF/+BC+ is the postfix expression of A+BDE/F+B*C
登入後即可作答並保存紀錄。
核心觀念
本題考查**中序運算式(Infix Expression)轉換為後序運算式(Postfix Expression / Reverse Polish Notation, RPN)**的邏輯與推導。主要涉及以下核心要素:
- 運算子優先順序(Operator Precedence):
- 高優先順序:乘法
$*$與除法$/$。 - 低優先順序:加法
$+$與減法$-$。
- 高優先順序:乘法
- 結合律(Associativity):
- 四則運算子皆具備左結合性(Left-to-Right Associativity)。當運算子優先順序相同時,由左至右依序處理。
- 後序運算式定義:
- 將二元運算子寫在兩個運算元之後,即 。後序運算式不需要括號即可唯一確定運算順序。
解題方法
轉換中序運算式至後序運算式最嚴謹的方法為完全括號法(Parenthesization Method):
- 依優先順序與結合律加括號:明確每一個子運算的範疇。
- 運算子後移:將每一個括號內的運算子移動到該括號的右邊界之外。
- 移除所有括號:去除括號後即得正確的後序運算式。
題目中二算式之推導步驟:
算式一(對應選項 A、B):
- 加括號:
- 乘除優先且左結合: 與
- 加減左結合:
- 運算子後移:
- 去括號:
算式二(對應選項 C、D):
- 加括號:
第 8 題
Consider the following function that takes reference to head of a Doubly Linked List as parameter. Assume that a node of
doubly linked list has previous pointer as prev and next pointer as next.
void fun(struct node **head_ref)
{
struct node *temp = NULL;
struct node *current = *head_ref;
while (current != NULL)
{
temp = current->prev;
current->prev = current->next;
current->next = temp;
current = current->prev;
}
if(temp != NULL)
*head_ref = temp->prev;
}
Assume that reference of head of a doubly linked list L is passed to above function. What is the resulting linked list after the
function call?
(A) 2<--> 1 <--> 4 <--> 3 <--> 6 <-->5 when L is 2 <--> 1 <--> 4 <--> 3 <--> 6 <-->5
(B) 5<--> 4 <--> 3 <--> 2 <--> 1 <-->6 when L is 5 <-->4<--> 3 <-->2 <-->6<-->1
(C) 6 <-->5<--> 4 <--> 3 <--> 2 <--> 1 when L is 1 <--> 2 <--> 3 <--> 4 <--> 5 <-->6
(D) 6 <--> 5 <--> 4 <--> 3 <--> 1 <--> 2 when L is 1 <--> 2 <--> 3 <--> 4 <--> 5 <-->6
登入後即可作答並保存紀錄。
核心觀念
本題考查雙向鏈結串列(Doubly Linked List)指標操作與串列反轉(List Reversal)演算法。
在雙向鏈結串列中,每個節點皆包含兩個指標:
prev:指向前一個節點。next:指向後一個節點。
當我們遍歷串列,將每一個節點的 prev 與 next 指標相互交換(Swap),並在迴圈結束後將表頭指標(*head_ref)重新指向原串列的尾節點(Tail Node)時,即可完成雙向鏈結串列的原地(In-place)反轉。
解題方法
1. 程式碼邏輯分析與推導
分析 fun 函數的內部運作步驟:
void fun(struct node **head_ref)
{
struct node *temp = NULL;
struct node *current = *head_ref;
while (current != NULL)
{
temp = current->prev; // 步驟 1: 暫存原先的前驅指標 prev
current->prev = current->next; // 步驟 2: 將 prev 改指向原先的後繼節點 next
current->next = temp; // 步驟 3: 將 next 改指向原先的前驅節點 temp
current = current->prev; // 步驟 4: 移動 current 至下一個待處理節點
}
if(temp != NULL)
*head_ref = temp->prev; // 步驟 5: 更新頭指標指向原串列的尾節點
}
-
關鍵推進邏輯(步驟 4):
執行current = current->prev;時,由於步驟 2 已將current->prev指向原先的current->next,因此這一行實際上等同於讓current指向原串列中的下一個節點,從而順利向後遍歷整個串列。 -
頭指標更新邏輯(步驟 5):
當迴圈結束時(current == NULL),temp會停在原串列倒數第二個節點。而在最後一次迭代中,原尾節點的prev已被改為NULL,next則改指向temp。因此在反轉後的串列中,temp->prev恰好指向原串列的尾節點(即反轉後的全新頭節點)。透過*head_ref = temp->prev;,頭指標被正確更新。
由此可知,fun 函數的功能為:將傳入的雙向鏈結串列全域反轉(Reverse)。
2. 實例推導
第 9 題
The following function reverse() is supposed to reverse a singly linked list. There is one line missing at the end of the
function.
/* Link list node /
struct node
{
int data;
struct node next;
};
/* head_ref is a double pointer which points to head (or start) pointer of linked list /
static void reverse(struct node* head_ref)
{
struct node* prev = NULL;
struct node* current = head_ref;
struct node next;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
/ADD A STATEMENT HERE/
}
What should be added in place of "/ADD A STATEMENT HERE/", so that the function correctly reverses a linked list.
(A) *head_ref = prev;
(B) current =*head_ref;
(C) next =*head_ref;
(D) *head_ref = NULL;
登入後即可作答並保存紀錄。
核心觀念
本題考查**單向鏈結串列(Singly Linked List)的原地反轉(Iterative In-place Reversal)**以及 **C 語言指標的指標(Double Pointer / Pointer to Pointer)**應用。
-
三指標迴圈控制:
在迭代法反轉單向鏈結串列時,需要維持三個指標:prev:記錄當前節點的前驅節點(反轉後的後繼節點)。current:記錄當前正在處理的節點。next:暫存當前節點原本的下一個節點,防止反轉指標時造成斷鏈(Memory Leak / Disconnection)。
-
傳址呼叫(Call by Reference / Pass by Address):
函式參數宣告為struct node** head_ref(雙重指標)。若要讓主呼叫端(Caller)的頭指標真正指向反轉後的新頭節點,必須透過解指標(Dereference)操作*head_ref來修改主呼叫端的頭指標內容。
解題方法
1. 演算法追蹤(Tracing)
假設輸入的鏈結串列為:,指標 head_ref 指向儲存節點 位址的指標。
- 初始狀態:
prev = NULLcurrent = *head_ref(指向節點 )
- 迴圈過程 (
while (current != NULL)):- 第 1 次迭代:
next = current->next(暫存節點 )current->next = prev(節點 指向 )prev = current(prev指向節點 )current = next(current指向節點 )
- 第 2 次迭代:
next = current->next(暫存節點 )current->next = prev(節點 指向節點 )prev = current(prev指向節點 )current = next(current指向節點 )
- 第 3 次迭代:
next = current->next(暫存 )current->next = prev(節點 指向節點 )prev = current(prev指向節點 )
- 第 1 次迭代:
第 10 題
What does the following function do for a given binary tree?
int f(struct node *root)
{
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 0;
return 1 + f(root->left) + f(root->right);
}
(A) Counts leaf nodes when x =1 and y=0;
(B) Counts internal nodes when x =0 and y=1.
(C) Returns height where height is defined as number of edges on the path from root to deepest node when x=0 and y=1
(D) Return diameter where diameter is number of edges on the longest path between any two nodes when x =1 and y=0
登入後即可作答並保存紀錄。
本題考查的核心觀念是遞迴函式在二元樹上的應用與分析,特別是理解遞迴的基底條件 (base cases) 和遞迴關係 (recursive relation) 如何共同決定函式的最終功能。透過追蹤函式在不同節點類型(空節點、葉節點、內部節點)上的行為,可以推斷其計算目的。
完整解題過程:
我們來逐步分析給定的函式 f:
int f(struct node *root)
{
if (root == NULL)
return 0; // 條件 1
if (root->left == NULL && root->right == NULL)
return 0; // 條件 2
return 1 + f(root->left) + f(root->right); // 條件 3
}
-
基底條件 (Base Case 1):
if (root == NULL) return 0;
當函式遇到一個空指標(即沒有節點)時,它會回傳 。這表示空子樹對函式的計數沒有貢獻。 -
基底條件 (Base Case 2):
if (root->left == NULL && root->right == NULL) return 0;
當函式遇到一個節點,且該節點的左子樹和右子樹都是空指標時,這表示該節點是一個葉節點 (leaf node)。對於葉節點,函式也回傳 。這意味著葉節點本身不被計數。 -
遞迴關係 (Recursive Relation):
return 1 + f(root->left) + f(root->right);
如果一個節點既不是空指標,也不是葉節點(即它至少有一個子節點),那麼它就是一個內部節點 (internal node)。對於這種節點,函式會回傳 加上其左子樹和右子樹遞迴呼叫的結果之和。這個 的回傳值表示該內部節點本身被計數了一次。
綜合分析:
第 11 題
Consider the problem of solving single-source shortest-paths on the following weighted directed graph:
Let d[i, j] denote the length of shortest path from node i to nodej. For the following items, choose the correct one(s):
(A) d[0,1]=7
(B) d[0,2] = 11
(C) d[0,3]=6
(D) d[0,4] = 8
(E) d[0,5] = 6
登入後即可作答並保存紀錄。
核心觀念
本題考單一起點最短路徑。 表示從節點 到節點 的最短路徑長度;路徑長度是沿途有向邊權重的總和。由於圖中有負權邊,可用 Bellman–Ford 的邊鬆弛觀念計算,不能只按邊權皆非負的情況處理。
解題方法
從節點 出發,先比較到節點 、 的路徑:
到節點 有直接路徑 ,長度為 ;也有 ,長度為 ,因此
節點 可由 到達,因此
節點 可沿 到達,長度為 ;
第 12 題
Follow the previous question. Choose the correct item(s):
(A) d[0,6] = 5
(B) d[0,7] = 9
(C) d[0,8] = 7
(D) There are exactly two shortest paths from node 0 to node 4.
(E) There are exactly two shortest paths from node 0 to node 9.
登入後即可作答並保存紀錄。
核心觀念
- 單源最短路徑問題(Single-Source Shortest Path, SSSP):
在給定帶權圖 中,指定一源點(Source Node),求源點到圖中其餘所有頂點 的最短距離 (題目簡寫為 )。 - Dijkstra 演算法(Dijkstra's Algorithm):
適用於邊權重為非負數()的圖形。演算法採用貪婪策略(Greedy Strategy),每次從未存取的頂點集合中選取當前估計距離最小的頂點 加入已確定集合 ,並對 的鄰接邊進行鬆弛操作(Relaxation)。 - 最短路徑數量統計(Shortest Path Counting):
在執行 Dijkstra 演算法時,可同時維護一陣列 記錄從源點 到頂點 的最短路徑總條數。其動態規劃遞迴關係式如下:- 若發現更短路徑(即 ):
- 若發現等長的最短路徑(即 ):
- 若發現更短路徑(即 ):
解題方法
本題依據前題(第 11 題)給定之帶權圖 (頂點集合 及其邊權重矩陣)進行計算。
以頂點 為源點,初始化距離陣列 ,其餘 ;路徑計數陣列 ,其餘 。
執行 Dijkstra 演算法之鬆弛與路徑統計推導結果如下表所示:
| 頂點 | 最短距離 | 最短路徑條數 | 最短路徑軌跡 |
|---|---|---|---|
| 0 | |||
| 1 | |||
| 2 | |||
| 3 | |||
| 4 | 與 | ||
| 5 | |||
| 6 |
第 13 題
Let f(n) and g(n) be asymptotically positive functions, and lg x = log2(x). Which of the following statements are correct?
(A) If f(n) = O(g(n)) then lgf(n) = O(lgg(n)), where g(n) ≥ 2 and f(n) ≥ 1 for n ≥ 1.
(B) If f(n) = O(n) then f(n) x f(n) = O(n²).
(C) If f(n) = O(n) then 2f(n) = O(2").
(D) f(n) + o(f(n)) = θ(f(n)).
(E) f(n) = o(f(n/2)).
登入後即可作答並保存紀錄。
核心觀念
本題考查**漸進符號(Asymptotic Notations)**的嚴格數學定義與代數運算性質,包含:
- Big- 定義:,使得對所有 ,皆滿足 。
- Little- 定義:。
- Big- 定義: 且 。
- 對數與指數的漸進比較性質。
解題方法
驗證漸進分析敘述時,切入點分為兩類:
- 證明敘述正確:直接由定義出發,透過不等式變形找出符合條件的正常數 與 ,或利用極限性質證明。
- 證明敘述錯誤:構造合法的反例函數(Counterexample),說明前提成立但結論不成立。
選項分析
(A) 正確
- 推導與證明:
已知 ,代表存在常數 與 ,使得對所有 ,。
題目給定 且 ,兩邊取底數為 的對數()可得:
因為 ,所以 。- 若 ,則 ,直接推得 。
- 若 ,則 ,可將常數項放大:。
此時:
令新常數 ,則對所有 ,均滿足:
故符合定義 。
(B) 正確
- 推導與證明:
已知 ,代表存在常數 與 ,使得對所有 ,。
兩邊同乘以 (因 ):
令新常數 ,對所有 均滿足:
第 14 題
Assume that the function value of each of the following functions is constant for n ≤ 2.
t(n)=n+ Σ [t(k)+t(n-k)],
k=1
g(n)=g(n/2)+√n,
f(n)=2f(n/4)+√n,
h(n)=5h(n/2)+(n lg n)²,
a(n) = a(n-1)+n* lg n.
Choose the correct answers.
(A) t(n) = θ(2")
(B) f(n)=θ(√n)
(C) g(n)=θ(√n)
(D) h(n) = θ(n^log2(5)) (E) a(n) = θ(n² lg n)
登入後即可作答並保存紀錄。
核心觀念
本題旨在考驗漸近複雜度(Asymptotic Complexity)分析與遞迴關係式(Recurrence Relation)的求解。主要涵蓋以下核心工具與定理:
- 主定理(Master Theorem):適用於型如 的分治型遞迴式,根據 與 的成長速率比較分為三種 Case:
- Case 1:若 (其中 ),則 。
- Case 2:若 (其中 ),則 。
- Case 3:若 (其中 )且滿足正則條件(Regularity Condition)(),則 。
- 差分法(Substitution / Subtracting equations):對於含有累加項()的全歷史遞迴式,可利用 消去累加項,化簡為一階線性遞迴關係式。
- 級數夾擠與積分逼近法(Integral Approximation):對於無法直接套用主定理的非分治遞迴式(如 ),可展開為 ,並利用定積分或上下界夾擠判定漸近階數。
解題方法
針對題目給定之 5 個遞迴關係式,分別進行推導:
1. 函數
注意累加項中 當 從 到 時,兩項總和完全對稱:
因此遞迴式可寫為:
同理,將 以 代入可得:
兩式相減:
解此一階線性遞迴關係式:
2. 函數
符合主定理形式,參數為 :
- 計算臨界指數:。
- 比較成長階數:,符合 Case 3 條件(取 )。
- 檢驗正則條件:,取 成立。
- 由主定理 Case 3 可得:。
3. 函數
符合主定理形式,參數為 :
- 計算臨界指數:。
- 比較成長階數:,符合 Case 2 條件()。
- 由主定理 Case 2 可得:。
4. 函數
第 15 題
The following statements about minimum spanning tree (MST) may or may not be correct. Assume that the weighted graph
G = (V, E) is undirected and connected. Do not assume that edge weights are distinct unless this is specifically stated. Chose
the correct items.
(A) If |E|≥1-1, and there is a unique heaviest edge, then this edge cannot be part of any MST of G.
(B) If G has a cycle with a unique heaviest edge e, then e cannot be part of any MST of G.
(C) If the lightest edge in G is unique, then it must be part of every MST of G.
(D) If G has a cycle with a unique lightest edge e, then e must be part of some MST of G.
(E) The shortest path between two nodes is necessarily part of some MST of G.
登入後即可作答並保存紀錄。
核心觀念
本題考查圖形理論(Graph Theory)中**最小生成樹(Minimum Spanning Tree, MST)**的核心定理與性質,包含:
- 割性質(Cut Property):對圖形 的任意切割 ,若邊 是跨越該切割的所有邊中權重嚴格最小者(unique lightest cross edge),則邊 必定包含於 的每一個 MST 中。
- 迴路性質(Cycle Property):對圖形 中的任意簡單迴路 ,若邊 是該迴路上權重嚴格最大者(unique heaviest edge),則邊 絕不可能包含於 的任何 MST 中。
- 橋/割邊(Bridge / Cut Edge):若移除某邊會導致圖形不連通,則該邊稱為橋。生成樹為了維持全圖連通性,必須包含圖形中的所有橋,不論其權重大小。
- 最短路徑與 MST 的差異:單源最短路徑(Shortest Path)關注的是特定兩點間的路徑累積權重和,而 MST 關注的是全圖連通的總邊權重和,兩者的最佳化目標不同。
解題方法
針對此類觀念導向的選擇題,切入點如下:
- 定理驗證:若選項敘述符合 MST 的標準定理(如 Cut Property 或 Cycle Property),則直接給出嚴謹的邏輯推導。
- 反例建構(Counterexample):若選項敘述並非通用定理,則嘗試建構最小規模的反例圖形(如少數頂點與邊的簡單權重圖),只要舉出一個反例即可判定該選項錯誤。
選項分析
(A) 錯誤
- 題目敘述:若 且存在唯一的最重邊,則該邊不可能屬於 的任何 MST。
- 錯誤原因:若圖形 本身為一棵樹(即 ),則 的生成樹即為其本身(唯一的生成樹)。此時,圖中所有的邊(包含該唯一的最重邊)都是連通圖形不可或缺的「橋(Bridge)」,因此該最重邊必定包含於 的 MST 中。
- 反例:設 為包含 3 個頂點與 2 條邊的路徑圖 ,邊權重分別為 、。邊 是唯一的最重邊,但為了連通所有頂點, 唯一的 MST 必須包含 。
(B) 正確
- 題目敘述:若 包含一個迴路且該迴路上有唯一的最重邊 ,則 不可能屬於 的任何 MST。
- 敘述分析:此即為標準的 Cycle Property(迴路性質)。
- 證明:採用反證法(Proof by Contradiction)。假設存在一個包含邊 的 MST 記為 。若將 自 中移除, 會分裂成兩個連通元件 與 。因為 原本屬於迴路 ,則迴路 上必存在另一條邊 同樣跨越 與 。根據題意, 是迴路 上唯一的最重邊,故 。此時若構造新生成樹 ,其總權重為 ,這與 為最小生成樹的假設矛盾。故 絕不可能屬於任何 MST。
(C) 正確
- 題目敘述:若 中權重最小的邊是唯一的,則它必定包含於 的每一個 MST 中。
- 敘述分析:此即為標準 Cut Property(割性質) 的特例。
- 證明:設 為全圖中嚴格最小的邊(即對任意 皆有 )。考慮將頂點集 切割為 與 。
第 16 題
Which of the following statements about sorting algorithms are incorrect?
(A) The merge sort and quick sort are designed based on the similar algorithm design principle.
(B) If most of the numbers are in the correct order, quick sort is the best algorithm.
(C) The worst-case time complexity of quick sort, merge sort, and heap sort is O(nlogn).
(D) The worst-case time complexity and the expected time complexity of both merge sort and heap sort are in the same order.
(E) No sorting algorithm has time complexity lower than O(nlogn).
登入後即可作答並保存紀錄。
核心觀念
本題考查核心資料結構與演算法中「排序演算法(Sorting Algorithms)」的設計範式、時間複雜度分析及理論下界限制:
- 分治法(Divide-and-Conquer Paradigm):
- 合併排序(Merge Sort)與快速排序(Quick Sort)均建構於分治原則:將大問題分割(Divide)為小問題、遞迴解決(Conquer)後進行合併或劃分(Combine)。
- 經典排序演算法之時間複雜度:
- Merge Sort:最佳 、平均 、最壞 。
- Heap Sort:最佳 、平均 、最壞 。
- Quick Sort:最佳 、平均 、最壞 。
- Insertion Sort:最佳 (輸入近乎已排序時)、平均 、最壞 。
- 排序演算法之理論下界(Lower Bound):
- 比較型排序(Comparison-based Sorting):利用決策樹(Decision Tree)模型推導,在最壞情況下所需比較次數的下界為 。
- 非比較型排序(Non-comparison Sorting):如計數排序(Counting Sort)、基數排序(Radix Sort)與桶排序(Bucket Sort),突破比較限制,在特定條件下可達到線性時間複雜度 。
解題方法
本題為研究所入學考試常見之複選敘述判斷題,目標為選出**敘述錯誤(incorrect)**的選項。切入步驟如下:
- 檢查各演算法的設計範式,確認 Merge Sort 與 Quick Sort 是否同屬分治法。
- 分析資料在近乎已排序(Nearly Sorted)狀態下的演算法效能表現。
- 查核各演算法於最壞情況(Worst-case)與期望/平均情況(Expected/Average-case)的時間複雜度 Big- 階次。
- 釐清比較型排序的 下界與非比較型排序線性時間 之適用前提。
選項分析
-
(A) 正確:Merge Sort 與 Quick Sort 皆基於**分治法(Divide and Conquer)**設計。Merge Sort 先對半分割再遞迴排序並合併;Quick Sort 則先選取基準值(Pivot)進行劃分(Partition),使左側不小於/不大於右側後遞迴排序。兩者本質皆屬於分治演算法。
-
(B) 錯誤:當大部分數字已在正確位置(Nearly Sorted)時,傳統 Quick Sort(若固定選擇第一個或最後一個元素作為 Pivot)每次劃分會極度不對稱(切為 與 ),導致遞迴樹深度退化為 ,時
第 17 題
Consider a hash table of size 7, with hash function H(k) = k % 7, and pseudo random i = (i + 5) % 7. We want to insert
the following keys one by one from left to right.
15, 11, 25, 16, 9, 8, 12
If random probing is used, which of the following statements are incorrect?
(A) key 25 is at position 4.
(B) key 16 is at position 0.
(C) key 9 is at position 0.
(D) key 8 is at position 6.
(E) Some key has no place to store in the table.
登入後即可作答並保存紀錄。
核心觀念
本題考查**雜湊表(Hash Table)在開放定址法(Open Addressing)**下的碰撞解決策略——偽隨機探查(Pseudo-Random Probing / Random Probing)。
-
基本雜湊函數(Primary Hash Function):
將鍵值 映射至雜湊表大小 的索引範圍 中。 -
偽隨機探查策略(Random Probing Strategy):
當發生碰撞(Collision)時,依據題目給定的偽隨機遞迴式 計算下一個探查位置。即當位址 發生碰撞時,下一次探查的目標位址為:
由於步長 與表長 互質(),該探查序列能夠無重複地遍歷整個雜湊表的所有槽位(Slots)。
解題方法
建立大小為 的雜湊表,初始狀態各槽位皆為空(Empty):
[0]: 空,[1]: 空,[2]: 空,[3]: 空,[4]: 空,[5]: 空,[6]: 空
依序由左至右插入鍵值 15, 11, 25, 16, 9, 8, 12:
-
插入 :
- 初次位址:。
- 位置 為空,直接存入。
- 狀態:
[1] = 15
-
插入 :
- 初次位址:。
- 位置 為空,直接存入。
- 狀態:
[1] = 15,[4] = 11
-
插入 :
- 初次位址:。
- 位置 已被 佔用(碰撞)。
- 第 次探查位址:。
- 位置 為空,存入。
- 狀態:
[1] = 15,[2] = 25,[4] = 11
-
插入 :
- 初次位址:。
- 位置 已被 佔用(碰撞)。
- 第 次探查位址:。
- 位置 為空,存入。
- 狀態:
[0] = 16,[1] = 15,[2] = 25,[4] = 11
-
插入 :
- 初次位址:。
- 位置 已被 佔用(碰撞)。
- 第 次探查位址:,位置 已被 佔用(碰撞)。
- 第 次探查位址:。
- 位置 為空,存入。
- 狀態:
[0] = 16,[1] = 15,[2] = 25,[4] = 11,[5] = 9
第 18 題
Given 4 matrices Q, R, S, and T with dimensions 13x12, 12x30, 30x15, and 15x18, respectively. If we would like to obtain
the matrix multiplication QRST with the least number of scalar multiplications, which of the following statements are
incorrect?
(A) This is a divide-and-conquer question.
(B) The first pair of metrices to be multiplied are Q and R.
(C) The last matrix to be multiplied is T.
(D) There is more than one way to achieve the minimum number of scalar multiplications.
(E) The minimum number of scalar multiplications needed is 11250.
登入後即可作答並保存紀錄。
核心觀念
- 矩陣鏈乘積問題(Matrix Chain Multiplication Problem):給定一連串矩陣 ,求將它們依序相乘時所需的最少純量乘法(Scalar Multiplications)次數。
- 動態規劃(Dynamic Programming, DP):矩陣相乘具備結合律,不同的加括號方式(Parenthesization)計算次數差異極大。由於具有最佳子結構(Optimal Substructure)與重疊子問題(Overlapping Subproblems)的特性,若採用單純的分治法會導致重複計算大量的子問題,因此本題屬於經典的動態規劃問題。
- 純量乘法次數計算公式:若矩陣 維度為 ,矩陣 維度為 ,則兩矩陣相乘 需要花費 次純量乘法,相乘後產生的矩陣維度為 。
- DP 遞迴轉移方程式:設 表示將第 個矩陣至第 個矩陣相乘所需的最少純量乘法次數,則轉移方程式為:
其中 為第 個矩陣的維度。
解題方法
本題給定 4 個矩陣:
- (即 ):維度
- (即 ):維度
- (即 ):維度
- (即 ):維度
維度序列為 。採用由底向上(Bottom-up)動態規劃法計算 DP 表格 :
1. 矩陣鏈長度 (Base Cases)
2. 矩陣鏈長度 (相鄰兩矩陣相乘)
- (計算 ):
- (計算 ):
- (計算 ):
3. 矩陣鏈長度 (三個矩陣相乘)
-
計算 ():
- 切割點 (形式為 ):
- 切割點 (形式為 ):
- 取最小值:,最優加括號為 。
- 切割點 (形式為 ):
-
計算 ():
- 切割點 (形式為 ):
- 切割點 (形式為 ):
- 切割點 (形式為 ):
第 19 題
Let X = {a/25, b/20, c/10, d/20, e/50} be the alphabet and its frequency distribution. Which of the following statements are
correct?
(A) This is a greedy algorithm question.
(B) The code length of 'e' is 1.
(C) 'a' and 'c' have the same code length.
(D) The code length for the string "cad" is 9.
(E) There is more than one way to achieve optimum prefix code.
登入後即可作答並保存紀錄。
核心觀念
本題考查**霍夫曼編碼(Huffman Coding)與貪婪演算法(Greedy Algorithm)**的核心原理及應用:
- 最佳前綴碼(Optimum Prefix Code):任何字元編碼皆非其他字元編碼的前綴,確保解碼過程無歧義,且能達到最短的平均編碼長度。
- 霍夫曼演算法(Huffman Algorithm):一種基於貪婪策略(Greedy Strategy)建構最佳前綴碼二元樹的方法。每次從當前森林中選擇權重(頻率)最小的兩個節點進行合併,重複此步驟直到形成單一根節點的霍夫曼樹。
- 編碼長度與樹深:字元在霍夫曼樹中的葉節點深度(Depth)即為該字元的編碼長度 。加權路徑長(Weighted Path Length, WPL)公式為:
其中 為字元 的頻率, 為字元 的編碼長度。
解題方法
根據題目給定的字母集與出現頻率 :
步驟 1:初始化節點
將各字元依頻率大小排列作為葉節點:
步驟 2:構建霍夫曼樹(Huffman Tree)
- 第一次合併:選取頻率最小的兩節點 與 ,合併為新節點 ,權重為 。
(註: 與 權重同為 20,若選擇 與 合併亦可)。
當前剩餘節點:。 - 第二次合併:選取當前最小的兩節點 與 ,合併為新節點 ,權重為 。
當前剩餘節點:。 - 第三次合併:選取當前最小的兩節點 與 ,合併為新節點 ,權重為 。
當前剩餘節點:。 - 第四次合併:合併最後兩節點 與 ,形成根節點 ,權重為 。
步驟 3:確定字元編碼長度
繪製成的霍夫曼樹結構如下(根節點深度設為 0):
第 20 題
Which of the following statements describe the differences between Dynamic Programming and Divide-and-Conquer?
(A) Whether the subproblems overlap or not
(B) The division of problems
(C) The combination of subproblems
(D) The way the base case is solved
(E) The depth of recurrence
登入後即可作答並保存紀錄。
核心觀念
本題考驗演算法設計典範(Algorithm Design Paradigms)中**動態規劃(Dynamic Programming, DP)與分治法(Divide-and-Conquer, D&C)**的核心定義與主要差異。
兩者皆屬於「將大問題拆解為小問題」的遞迴思維,但其適用場景與計算機制有本質上的不同:
- 分治法(Divide-and-Conquer):
- 子問題獨立(Disjoint / Non-overlapping Subproblems):將原問題切割成數個相互獨立、互不重疊的子問題,分別遞迴求解後,再將結果合併(Combine)。
- 典型代表:合併排序(Merge Sort)、快速排序(Quick Sort)、Strassen 矩陣乘法。
- 動態規劃(Dynamic Programming):
- 子問題重疊(Overlapping Subproblems)與最佳子結構(Optimal Substructure):原問題切割出的子問題會重複出現(即不同的大問題包含相同的子子問題)。DP 透過「表格化(Tabulation)」或「備忘錄(Memoization)」儲存已解過的子問題答案,避免重複計算,從而將指數級時間複雜度降低至多項式級。
- 典型代表:矩陣鏈乘積(Matrix-chain Multiplication)、最長公共子序列(LCS)、背包問題(Knapsack Problem)、Floyd-Warshall 演算法。
解題方法
比較動態規劃與分治法的特徵差異:
| 比較項目 | 分治法 (Divide-and-Conquer) | 動態規劃 (Dynamic Programming) |
|---|---|---|
| 子問題關係 | 子問題互相獨立/不重疊 (Disjoint) | 子問題高度重疊 (Overlapping) |
| 重複計算處理 | 各子問題獨立求解,可能重複計算 | 利用記憶化/表格記錄已求解結果,避免重複計算 |
| 核心要素 | 1. Divide<br>2. Conquer<br>3. Combine | 1. Optimal Substructure<br>2. Overlapping Subproblems |
| 空間開銷 | 主要為遞迴呼叫堆疊(Stack Frame) | 需額外空間儲存 DP Table / Cache |
由此可知,劃分兩者最主要的關鍵差異,在於子問題之間是否存在重疊性(Whether the subproblems overlap or not)。