108 年 國立清華大學資訊工程學系碩士班《基礎計算機科學》
第 1 題10 分
- (10%) Use generating functions to answer the following questions.
(A) (7%) Find the solution of the recurrence relation with and .
(B) (3%) Find the coefficient of in the power series of .
登入後即可作答並保存紀錄。
(A) 遞迴關係式求解
核心觀念
本題考查**普通生成函數(Ordinary Generating Function, OGF)**解非齊次線性遞迴關係式。
主要使用以下基本公式與級數展開:
- 若序列為 ,其生成函數定義為 。
- 常用幾何級數與閉合形式:
- 利用部分分式分解(Partial Fraction Decomposition)將 拆解為標準項後,藉由二項式定理展開取各項係數即為閉合解 。
解題方法
題目給定遞迴關係式為:
初始條件:,。
步驟一:設定生成函數並列出方程式
令 。
在遞迴關係式兩端同乘 並對 取和:
步驟二:將左式化為 的形式
代入左式可得:
步驟三:將右式非齊次項轉換為封閉形式
將左式與右式統整,並將左式的常數項 移至右側(注意到 等同於將右側補回 的項,但需調整 的缺項):
直接在等號兩側還原為完整的無窮級數形式更不易出錯:
將右側的常數項合併並移項整理:
通分右側:
分子展開後計算得:
因此:
兩側同除以 :
步驟四:部分分式分解(Partial Fraction Decomposition)
設:
利用遮蔽法(Heaviside cover-up method)與比較係數求解各係數:
-
求 :兩端同乘 並令 :
-
求 :兩端同乘 並令 :
-
求 :兩端同乘 並令 :
-
求 與 :
將已求得的各項帶入或藉由特徵根法對應非齊次解形式。
本題之常微分/差分特徵方程為 。非齊次項包含 與一次多項式 。由於 為單重特徵根,對應非齊次多項式的特解形式為 。
因此,閉合形式之通用解為:
第 2 題10 分
- (10%) How many relations are there on a set with elements that are
(A) (5%) both reflexive and symmetric?
(B) (5%) neither reflexive nor irreflexive?
登入後即可作答並保存紀錄。
核心觀念
本題評量離散數學中二元關係(Binary Relations)的計數問題。設集合 的元素個數為 ,則其笛卡兒積(Cartesian product) 共有 個有序對(ordered pairs)。 上的任意關係 即為 的一個子集合,亦可以 的布林關聯矩陣(Relation Matrix) 表示:
- 主對角線元素(Diagonal elements):共 個有序對 ,對應矩陣主對角線 。
- 非對角線對稱元素對(Off-diagonal symmetric pairs): 與 (其中 ),共有 組無序對,每組包含 2 個互為反向的有序對,合計 個元素。
各類關係的定義如下:
- 反身性(Reflexive):對所有 ,皆有 。亦即主對角線 個元素必須全為 1。
- 對稱性(Symmetric):對所有 ,若 ,則 。亦即關聯矩陣為對稱矩陣()。
- 反自反性/非反身性(Irreflexive):對所有 ,皆有 。亦即主對角線 個元素必須全為 0。
解題方法
解決關係計數問題的最佳切入點為**「矩陣位置獨立性分析」與「乘法原理/排容原理」**:
-
(A) 同時滿足反身與對稱:
- 關係的計數可拆解為主對角線元素與非對角線元素的選取方法數之乘積。
- 反身性鎖定主對角線元素;對稱性則限制非對角線對稱元素對必須同進同出。
-
(B) 既非反身亦非反自反(Neither reflexive nor irreflexive):
- 可直接分析主對角線的狀態:反身性要求主對角線「全為 1」,反自反性要求主對角線「全為 0」。
- 因此「既非反身亦非反自反」等價於主對角線元素「不全為 1 且不全為 0」,其餘非對角線元素則可自由選取。
- 亦可採用餘集與排容原理(Principle of Inclusion-Exclusion)從所有可能關係中扣除反身關係與反自反關係。
小題詳細推導與分析
(A) Both reflexive and symmetric(既反身又對稱)
- 主對角線元素:
- 因 具反身性,對所有 , 必定屬於 。
- 每個主對角線位置只有 1 種選擇(必須存在),共 個位置,可能情形數為:
- 非對角線元素:
- 因 具對稱性,對於每一對相異元素形成的對稱對 ():
- 兩者同時屬於
- 兩者同時不屬於
- 共有 組對稱對,每一組恰有 2 種選法。
- 非對角線部分的可能情形數為:
- 因 具對稱性,對於每一對相異元素形成的對稱對 ():
- 綜合計算:
- 依乘法原理,既反身又對稱的關係總數為:
(B) Neither reflexive nor irreflexive(既非反身亦非反自反)
假設集合元素個數 :
方法一:對角線獨立狀態分析法(最直觀法)
- 主對角線限制:
- 主對角線上共有 個位置,每個位置可選入或不選入關係中,總配置數為 種。
第 3 題5 分
- (5%) How many nonisomorphic unrooted trees are there with five vertices?
登入後即可作答並保存紀錄。
核心觀念
本題考查「樹」與「圖同構」的基本分類。
- 樹是連通且不含循環的無向圖。
- 具有 個頂點的樹必有 條邊,因此本題的樹有 條邊。
- 「非同構」表示不考慮頂點標籤;只要兩個圖的鄰接結構相同,就視為同一種。
- 「非根樹」表示沒有指定特殊的根頂點。
樹中所有頂點的度數總和為
解題方法
依照樹的最大度數分類。五個頂點的樹,其最大度數介於 與 之間。
情況一:最大度數為
某一頂點與其他四個頂點全部相連,形成星狀樹 :
此結構只有一種非同構形式。
情況二:最大度數為
設度數為 的頂點為中心。它必須連接三個分支,而總共還有四個其他頂點。
為了使用完全部五個頂點,其中一個分支必須再延伸一個頂點,形成度數序列
第 4 題5 分
- (5%) Multiple answer question. (It is possible that more than one of the choices are correct. Find out all correct choices.)
A hash table of length 10 uses the hash function and the linear probing for handling overflow. After inserting 6 values into an initially-empty hash table, the table is as shown below. Which one(s) of the following choices gives a possible order in which the key values could have been inserted in the table?
| index | key |
|---|---|
| 0 | |
| 1 | |
| 2 | 42 |
| 3 | 23 |
| 4 | 34 |
| 5 | 52 |
| 6 | 46 |
| 7 | 33 |
| 8 | |
| 9 |
(A) 46, 42, 34, 52, 23, 33
(B) 34, 42, 23, 52, 33, 46
(C) 46, 34, 42, 23, 52, 33
(D) 42, 46, 33, 23, 34, 52
(E) 42, 23, 34, 46, 52, 33
登入後即可作答並保存紀錄。
核心觀念
本題評量開放定址法(Open Addressing)中的線性探測(Linear Probing)碰撞處理機制,以及各鍵值(Key)在插入過程中的先後相依關係(Dependency / Partial Order)。
-
雜湊函數與初始位置(Home Slot):
依題意,長度 ,雜湊函數為 。鍵值 首先嘗試放入其初始位置 。 -
線性探測(Linear Probing):
若位置 已被佔據(發生碰撞 Overflow),則依序檢查相鄰的下一個位置:直到找到第一個空的槽位(Empty Slot)將其存入。
-
插入順序的偏序限制:
如果鍵值 最終落在位置 ,且 ,表示在 被插入的當下,從初始位置 到 的連續區間內所有槽位都必須已被其他鍵值佔據。因此,佔據這些槽位的鍵值必須在 之前被插入。
解題方法
首先比對各鍵值的初始雜湊值與最終所在位置:
| 鍵值 | 初始雜湊值 | 最終位置(Actual Index) | 是否發生探測位移 |
|---|---|---|---|
| 42 | 2 | 否(直接落在初始位置) | |
| 23 | 3 | 否(直接落在初始位置) | |
| 34 | 4 | 否(直接落在初始位置) | |
| 52 | 5 | 是(由 2 位移至 5) | |
| 46 | 6 | 否(直接落在初始位置) | |
| 33 | 7 | 是(由 3 位移至 7) |
關鍵推導(偏序條件建立):
-
針對鍵值 52:
-
初始位置為 ,最終存放在 。
-
這表示在插入 時,槽位 必須都已經有資料。
-
目前佔據這三個槽位的是 (槽位 2)、(槽位 3)、(槽位 4)。
-
條件一: 均必須在 之前被插入,即:
-
-
針對鍵值 33:
-
初始位置為 ,最終存放在 。
-
這表示在插入 時,槽位 必須都已經有資料。
-
目前佔據這四個槽位的是 (槽位 3)、(槽位 4)、(槽位 5)、(槽位 6)。
-
條件二: 均必須在 之前被插入,即:
-
-
綜合傳遞關係:
- 由於 ,且 ,因此 也必須在 之前插入。
- 綜合所有限制,其餘 5 個鍵值 全部都必須在 之前被插入。換言之, 必須是這 6 個元素中最後一個被插入的鍵值。
選項分析
第 5 題5 分
- (5%) Fill in the six blanks (I, II, …, and VI) in the following program that implements a queue by using 2 stacks.
class MyQueue<T>{
private:
stack<T> stack1;
stack<T> stack2;
public:
MyQueue()
{
stack1 = new stack<T>();
stack2 = new stack<T>();
}
// enqueue(): Add an element at the rear side of MyQueue
void enqueue(T e)
{
stack1.push(e);
}
// dequeue(): Remove the front element from MyQueue
T dequeue(T e)
{
if( (__I__).isEmpty() )
while( !(__II__).isEmpty() )
(__III__).push( (__IV__).pop() );
T temp = null;
if( !(__V__).isEmpty() )
temp = (__VI__).pop();
return temp;
}
}
登入後即可作答並保存紀錄。
核心觀念
本題考查資料結構中以兩個**堆疊(Stack)實作佇列(Queue)**的經典演算法:
- 佇列(Queue):遵循「先進先出」(FIFO, First-In-First-Out)原則。
- 堆疊(Stack):遵循「後進先出」(LIFO, Last-In-First-Out)原則。
- 兩次反轉等於同序:堆疊的彈出順序會將資料反轉一次;若將元素從第一個堆疊逐一彈出並壓入第二個堆疊,資料順序會經歷第二次反轉,剛好還原成先進先出(FIFO)的順序。因此通常配置:
stack1:作為輸入端(Inbox Stack),負責接收所有enqueue的新元素。stack2:作為輸出端(Outbox Stack),負責供應dequeue的取值。
解題方法
由類別成員與建構子可知,內部維護了 stack1 與 stack2:
-
enqueue(e)流程:
題目程式碼已給定:void enqueue(T e) { stack1.push(e); }這確立了
stack1為輸入端堆疊。 -
dequeue()流程:
欲取出佇列前端元素(最早進入的元素):- 若
stack2內尚有元素,則stack2的頂端即為當前最先進入佇列的元素,可直接彈出。 - 若
stack2為空,必須將stack1內現存的所有元素依序彈出並壓入stack2。此動作將stack1內的元素順序完全顛倒,使最早進入的元素移動至stack2的頂端。 - 傾倒完成後,若
stack2非空,則自stack2頂端彈出元素回傳;若stack2仍為空(代表原本佇列內無任何元素),則回傳null。
- 若
對應程式碼結構推導各空格:
- 第一步:檢查
stack2是否為空。若空,才需要將stack1的元素倒過來。
故 I 為if( (__I__).isEmpty() )stack2。 - 第二步:當
stack1還有元素時,將其逐一轉移至stack2。
故 II 為while( !(__II__).isEmpty() ) (__III__).push( (__IV__).pop() );stack1、III 為stack2、IV 為stack1。 - 第三步:檢查轉移後的
stack2是否非空,若是則從stack2取出頂端元素。
第 6 題5 分
- (5%) AVL Tree.
(A) (2%) Please draw how an initially-empty AVL tree would look like after sequentially inserting the integer keys 100, 200, 50, 300, 400. There is no need to show it in a step-by-step fashion; you only need to draw the final result.
(B) (3%) Continue the previous sub-problem. Suppose that the integer keys 25, 250, 225, 500, 240, 260 are sequentially inserted into the AVL tree of the previous sub-problem. Draw the AVL tree after all of these integer keys are inserted.
登入後即可作答並保存紀錄。
核心觀念
-
AVL 樹定義與平衡因子(Balance Factor, BF):
- AVL 樹為一種自平衡二元搜尋樹(Self-Balancing Binary Search Tree)。
- 對於樹中任一節點 ,其平衡因子定義為左子樹高度減去右子樹高度:
(空樹高度定義為 ,單一節點樹高度定義為 )。 - AVL 樹的平衡條件為:所有節點的平衡因子皆滿足 (即 )。
-
失衡判斷與旋轉調整(Rotations):
- 當新節點插入後,從插入位置沿著路徑向上回溯,找到第一個(深度最深、離插入點最近)滿足 的失衡節點 。
- 根據由 往插入節點路徑上的前兩步方向,分為四種旋轉型態:
- LL 型(路徑為左 左):對節點 進行單次右旋(Right Rotation)。
- RR 型(路徑為右 右):對節點 進行單次左旋(Left Rotation)。
- LR 型(路徑為左 右):先對左小孩進行左旋,再對節點 進行右旋(Double Rotation)。
- RL 型(路徑為右 左):先對右小孩進行右旋,再對節點 進行左旋(Double Rotation)。
解題方法
子題 (A):依序插入 100, 200, 50, 300, 400
- 插入 100:作為根節點。
- 插入 200:,置於 100 之右小孩。全樹平衡。
- 插入 50:,置於 100 之左小孩。此時根節點 100 的 ,全樹平衡。
- 插入 300:,置於 200 之右小孩。
- 節點 200 的 。
- 節點 100 的 。全樹平衡。
- 插入 400:,置於 300 之右小孩。
- 向上檢查平衡因子:
- 節點 300:
- 節點 200: 第一個失衡節點為 200。
- 判定型態:路徑為 (右)(右),屬於 RR 型。
- 執行旋轉:以 200 為軸進行左旋(Left Rotation),使 300 成為局部子樹的根節點,200 降為 300 的左小孩,400 為 300 的右小孩。
- 調整後,根節點 100 的左子樹高度為 1(節點 50),右子樹高度為 2(節點 300),;節點 300 的 。全樹恢復平衡。
- 向上檢查平衡因子:
子題 (B):承接 (A),繼續依序插入 25, 250, 225, 500, 240, 260
-
插入 25:,置於 50 之左小孩。
- 節點 50 的 。
- 節點 100 的左子樹高 2,右子樹高 2,。全樹平衡。
-
插入 250:,置於 200 之右小孩。
- 節點 200 的 。
- 節點 300 的左高 2、右高 1,。
- 節點 100 的左高 2、右高 3,。全樹平衡。
-
插入 225:,置於 250 之左小孩。
- 向上回溯檢查平衡因子:
- 節點 250:
- 節點 200: 第一個失衡節點為 200。
- 判定型態:路徑為 (右)(左),屬於 RL 型。
- 執行雙旋轉:
- 向上回溯檢查平衡因子:
第 7 題5 分
- (5%) Reconstruct and draw the maximum binary heap whose in-order traversal is 2, 16, 7, 62, 5, 9, 188, 14, 78, 10. There is no need to show it in a step-by-step fashion; you only need to draw the final result.
登入後即可作答並保存紀錄。
核心觀念
本題評量對 二元堆積(Binary Heap) 與 樹的走訪(Tree Traversal) 結構特性的掌握:
- Max Heap 定義:
- 結構性(Structural Property):必須是一棵完全二元樹(Complete Binary Tree, CBT)。若節點總數為 ,其形狀(樹狀骨架)是唯一確定的;若以陣列(1-based)表示,節點 的左子節點為 ,右子節點為 。
- 堆積性(Heap-Order Property):每個非根節點的值均不大於其父節點的值(),因此任何子樹的根節點必為該子樹中的最大值。
- 中序走訪(In-order Traversal):
- 遍歷順序為:左子樹 當前節點 右子樹。
- 笛卡兒樹(Cartesian Tree)視角:
- 給定一棵樹的「中序走訪序列」,同時要求滿足「父節點 子節點(Max Heap 特性)」,則整棵樹的根節點必然是該序列中的全域最大值。最大值左側的元素構成左子樹,右側元素構成右子樹,對各子樹亦遞迴適用此性質。
- 本題結合了「完全二元樹(CBT)形狀約束」與「In-order 序列」,兩者能互相印證並唯一確定每個節點的位置。
解題方法
給定節點數 ,中序走訪序列為:
步驟一:確定完全二元樹(CBT)的骨架與中序訪問順序
具有 10 個節點的 CBT,其 1-based 陣列索引對應的樹狀結構如下(編號 ):
- Level 1: 節點 1(Root)
- Level 2: 節點 2、3
- Level 3: 節點 4、5、6、7
- Level 4: 節點 8、9、10(節點 8、9 為節點 4 之子,節點 10 為節點 5 之左子)
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ /
8 9 10
對此骨架進行中序走訪(左 根 右),求出每個陣列位置被訪問的先後順序:
- 走訪左子樹(以 2 為根):
- 走訪 2 的左子樹(以 4 為根):先走訪 8 再走訪 4 再走訪 9。
- 走訪根 2。
- 走訪 2 的右子樹(以 5 為根):先走訪 10 再走訪 5。
- 至此左子樹訪問順序為:。
- 走訪整棵樹的根:。
- 走訪右子樹(以 3 為根):
- 走訪 3 的左子樹:。
- 走訪根:。
- 走訪 3 的右子樹:。
- 至此右子樹訪問順序為:。
第 8 題5 分
- (5%) The following algorithm takes an array as input and returns the array with all the duplicate elements removed. For example, if the input array is , the algorithm returns .
S = new empty set
A = new empty dynamic array
for every element x in input array
if not S.member(x) then
S.insert(x)
A.append(x)
return A
Suppose that the input array has elements. What is the big-O complexity of this algorithm, if the set S is implemented as:
(A) (1%) a hash table (with the assumption that overflow does not occur)?
(B) (2%) a binary search tree?
(C) (2%) an AVL tree?
登入後即可作答並保存紀錄。
核心觀念
本題探討「資料結構對演算法時間複雜度之影響」,主要評量考生對集合(Set)操作在不同底層資料結構下的時間複雜度分析能力。
演算法包含一個處理 個元素的迴圈,在每次迭代中對集合 進行成員查詢(member,即搜尋)與插入(insert)。演算法的總時間複雜度取決於:
- 迴圈執行次數:共執行 次。
- 動態陣列加入元素(
append):均攤時間複雜度為 。 - 集合操作的單次花費:在不同資料結構(Hash Table、BST、AVL Tree)下,集合內元素至多為 個時,單次
member與insert的時間複雜度差異。
解題方法
設輸入陣列長度為 。迴圈共執行 次,在第 次迭代時,集合 中的元素個數至多為 個(最大不超過 )。
- 每次迭代的操作包含:
S.member(x):搜尋操作。- 若不存在,執行
S.insert(x):插入操作。 A.append(x):動態陣列尾端插入,均攤花費 。
因此,每次迴圈的核心花費為集合的「搜尋」與「插入」。總時間複雜度為:
根據 Big-O 記號的定義,通常分析演算法的最壞情況(Worst-case complexity)。若題目有特殊假設(如 Hash Table 無溢位),則依假設推導。
各小題分析與推導
(A) a hash table (with the assumption that overflow does not occur)?
- 分析:
題目明確假設「overflow does not occur」(不發生溢位/碰撞衝突),表示雜湊函數能完美或無衝突地配置,因此每次雜湊表的搜尋(member)與插入(insert)操作時間複雜度皆為 。 - 推導:
迴圈共執行 次,每次迭代皆花費 : - 複雜度:。
(B) a binary search tree?
- 分析:
若集合 採用一般二元搜尋樹(Binary Search Tree, BST),未保證樹的平衡性。
第 9 題10 分
- (10%) The recurrence describes the running time of an algorithm A. A competing algorithm A' has a running time of . What is the largest integer value for such that A' is asymptotically faster than A?
登入後即可作答並保存紀錄。
核心觀念
本題的核心為主定理(Master Theorem)求解分治遞迴關係式(Divide-and-Conquer Recurrence),以及漸近時間複雜度的嚴格比較(Asymptotically Faster)。
-
主定理(Master Theorem):
對於遞迴式 ,其中 :- Case 1:若存在 ,使得 ,則 。
- Case 2:若 ,則 。
- Case 3:若存在 ,使得 ,且滿足正規條件(regularity condition,即存在 使得 ),則 。
-
漸近更快的定義(Asymptotically Faster):
演算法 比演算法 漸近更快(asymptotically faster),代表當 時, 的執行時間增長階數嚴格小於 ,即:
解題方法
步驟一:求演算法 A 的時間複雜度
演算法 的遞迴式為:
- 參數為 。
- 臨界次方為 。
- 由於 ,可知 。
- 比較 與 :
取 ,可得 。 - 根據主定理 Case 1:
步驟二:分析演算法 A' 的時間複雜度
演算法 的遞迴式為:
- 參數為分治次數 (正整數)、縮小倍數 、。
- 臨界次方為 。
根據 的數值大小,可分為三種情況:
- 當 時:
。
此時 ,且 (取 滿足正規條件)。
由主定理 Case 3 可得:
第 10 題15 分
- (15%) Consider the following undirected graph .
🖼️【此處有附圖,請對照原卷:六個頂點 n1~n6 的加權無向圖,邊與權重為 n1–n2: 30、n1–n4: 25、n2–n3: 5、n3–n4: 50、n2–n5: 20、n3–n5: 35、n3–n6: 15、n4–n6: 40、n5–n6: 10】
(A) (5%) Draw the process of finding a minimum spanning tree using Kruskal's algorithm.
(B) (5%) Draw the process of solving the single-source shortest path problem with node n1 as the source vertex using Dijkstra's algorithm.
(C) (5%) Starting from n1, find the Depth-First Search (DFS) traversal sequence of G (the priority of node is inversely proportional to the weight of incident edge).
登入後即可作答並保存紀錄。
核心觀念
- Kruskal 演算法:將邊依權重由小到大檢查;若加入某邊不會形成環,就納入最小生成樹,直到選出 條邊。
- Dijkstra 演算法:從來源點 出發,每次確定目前暫定距離最小的未處理頂點,再用該頂點更新鄰點距離:
- 深度優先搜尋(DFS):沿著尚未拜訪的鄰點深入;題目指定邊權重愈小,鄰點優先級愈高,因此每一步按相連邊權重由小到大選擇。
(A)Kruskal 最小生成樹
將所有邊依權重排序:
依序檢查:
| 邊 | 權重 | 處理 |
|---|---|---|
| 5 | 納入 | |
| 10 | 納入 | |
| 15 | 納入,連接兩個連通分量 | |
| 20 | 捨棄;加入會形成環 | |
| 25 | 納入 | |
| 30 | 納入,連接兩個連通分量,已選滿 5 條 | |
| 、、 | 35、40、50 | 不需再檢查;若加入皆會形成環 |
因此最小生成樹的邊為:
總權重為 。
(B)以 為來源的 Dijkstra 演算法
初始距離為 ,其他頂點距離皆為無限大。每次確定暫定距離最小的未處理頂點,並更新其鄰點:
| 確定頂點 | 更新結果 |
|---|---|
| (距離 0) | ,前驅為 ;,前驅為 |
| (距離 25) | ,前驅暫為 |
| (距離 30) | ,前驅為 ;,前驅為 |
第 11 題18 分
- (18%) Given an ordered file with keys 1, 2, …, 16, determine the number of key comparisons made by a search algorithm while searching for a specific key .
(A) (3%) is the binary search algorithm and is 2.
(B) (3%) is the binary search algorithm and is 10.
(C) (3%) is the binary search algorithm and is 15.
(D) (3%) is the Fibonacci search algorithm and is 2.
(E) (3%) is the Fibonacci search algorithm and is 10.
(F) (3%) is the Fibonacci search algorithm and is 15.
登入後即可作答並保存紀錄。
核心觀念
本題評量**二元搜尋(Binary Search)與費氏搜尋(Fibonacci Search)**在有序陣列中的搜尋追蹤(Trace)與鍵值比較次數(Key Comparisons)。
-
二元搜尋(Binary Search)的標準定義(依經典教科書 Horowitz / Sahni 規範):
- 給定排序好的陣列 ,區間為 ,初始時 。
- 中間索引計算公式為:
- 每次比較:
- 若 :搜尋成功,結束。
- 若 :往左半部搜尋,更新 。
- 若 :往右半部搜尋,更新 。
- 每次檢查 與 的關係計為 1 次關鍵鍵值比較(Key Comparison)。
-
費氏搜尋(Fibonacci Search)的標準定義(依經典教科書 Horowitz / Knuth 規範):
- 費氏數列定義為:
- 尋找最小的費氏數 ,使得 。
本題 ,而 ,,故選取 ()。 - 令目前檢驗位置為:
若使用累積偏移量偏移記法(Horowitz 標準演算法),設基準偏移量 (即有效區間左界前一位),索引設為 :
- 若 :往左區間搜尋,費氏指標降 1 級(),即新區間長度由 主導,下一步檢驗位移量改用 。
- 若 :往右區間搜尋,費氏指標降 2 級(),基準偏移量更新為 。
- 若 :搜尋成功,結束。
解題方法與詳細步驟
題目給定鍵值集合為有序數列 ,因此陣列索引與鍵值恰好相同,即 。
(A)~(C) 二元搜尋(Binary Search)
初始狀態:。
-
(A) 搜尋 :
- 第 1 次比較: 比較 與 。因 ,更新 。
- 第 2 次比較: 比較 與 。因 ,更新 。
- 第 3 次比較: 比較 與 。因 ,搜尋成功,停止。
- 總比較次數:3 次。
-
(B) 搜尋 :
- 第 1 次比較: 比較 與 。因 ,更新 。
- 第 2 次比較: 比較 與 。因 ,更新 。
- 第 3 次比較: 比較 與 。因 ,搜尋成功,停止。
- 總比較次數:3 次。
-
(C) 搜尋 :
- 第 1 次比較: 比較 與 。因 ,更新 。
- 第 2 次比較: 比較 與 。因 ,更新 。
- 第 3 次比較: 比較 與 。因 ,更新 。
- 第 4 次比較: 比較 與 。因 ,搜尋成功,停止。
- 總比較次數:4 次。
(D)~(F) 費氏搜尋(Fibonacci Search)
設定費氏數列:,索引分別對應 。
陣列長度 ,最小滿足以 之費氏數為 (),故起始設定:
,,三個費氏數變數為 。
- (D) 搜尋 :
- 第 1 次比較:
比較 與 。因 ,往左走:
更新 ,費氏數降為 , 保持 0。 - 第 2 次比較:
比較 與 。因 ,往左走:
更新 ,費氏數降為 , 保持 0。 - 第 3 次比較:
比較 與 。因 ,往左走:
更新 ,費氏數降為 , 保持 0。 - 第 4 次比較:
- 第 1 次比較:
比較 與 。因 ,往左走:
第 12 題7 分
- (7%) Given a store of items, what's is the least upper bound (in Big-O notation) of the running time of the solutions to the following problems:
(A) (3%) Fractional knapsack problem;
(B) (4%) General 0/1 knapsack problem.
登入後即可作答並保存紀錄。
核心觀念
本題評量貪婪演算法(Greedy Algorithm)、**動態規劃(Dynamic Programming)與計算複雜度理論(Computational Complexity Theory)**在經典背包問題中的應用與複雜度分析。
-
分數背包問題(Fractional Knapsack Problem):
- 物品可被任意分割選取。
- 具備貪婪選擇性質(Greedy-Choice Property)與最佳子結構(Optimal Substructure)。
- 典型解法為計算各物品之單位價值比率 。
- 若先進行排序再依序選取,時間複雜度為 。
- 若利用線性時間中位數選擇演算法(Median-of-Medians / Prune-and-Search),可在每一輪求得中位數比率並進行劃分,不需對全部物品排序,時間複雜度可達到 。
-
一般 0/1 背包問題(General 0/1 Knapsack Problem):
- 物品不可分割,只能選擇放入(1)或不放入(0)。
- 本問題為著名的 NP-hard(判定版本為 NP-complete)。
- 若使用動態規劃求解,時間複雜度為 (其中 為背包容量上限)。然而,輸入大小以二進位表示時,長度為 ,因此 屬於虛擬多項式時間(Pseudo-polynomial time),並非真正的多項式時間。
- 在一般情況下(General case,即數值 可任意大、且以二進位編碼),除非 ,否則不存在多項式時間演算法。其嚴格的確定性演算法最壞情況時間複雜度上界為指數時間 (透過窮舉或分支定界法)。
解題方法
(A) Fractional knapsack problem
- 方法一(基於排序的貪婪演算法):
- 計算每個物品的單位價值比率 ,耗時 。
- 將比率由大到小排序,耗時 。
- 依序將比率最高的物品裝入背包,直到裝滿為止,耗時 。
- 總時間複雜度為 。
- 方法二(基於線性選擇演算法的剪枝搜尋法 Prune-and-Search):
- 計算每個物品的單位價值比率 。
- 使用最壞情況為線性時間的選擇演算法(如 Median-of-Medians)找出比率的中位數 ,耗時 。
- 將物品分為三組:比率大於 、等於 、小於 。
- 計算比率大於 的物品總重量:
- 若總重量大於背包剩餘容量,則最佳解絕不包含比率小於 的物品,可將其全數捨棄,遞迴處理比率大於等於 的物品。
- 若總重量小於背包剩餘容量,則將該組物品全數裝入,扣除容量後,遞迴處理比率小於等於 的物品。
- 遞迴關係式為:
- 因此,分數背包問題的最小時間複雜度上界(tight bound)為 (若採傳統排序演算法寫 亦常見於標準教科書中,但以演算法最優上界而言為 )。