114 年 國立中山大學資訊工程學系資訊安全碩士班《離散數學與演算法》
第 1 題10 分
There are how many different ways we can write the number of 13 as a sum of positive integers, where the order of the summands is considered relevant.
登入後即可作答並保存紀錄。
這題考的是整數分割(Integer Partition)的概念,但題目特別強調「順序是相關的」,這意味著我們實際上是在計算一個正整數的「組合數」(Composition)。
一個正整數 的組合數是指將 寫成一連串正整數之和的方法數量,其中這些正整數的順序是被考慮的。例如,數字 3 的組合數有:
3
2+1
1+2
1+1+1
總共有 4 種。
這個問題可以用「星星與棒子」(Stars and Bars)的方法來解決。想像我們有 13 個星星(代表數字 13):
*************
我們要將這 13 個星星分成若干堆,每一堆至少有一個星星,且順序是相關的。這相當於在 13 個星星之間插入「棒子」來分隔它們。
在 13 個星星之間,總共有 個可能的「縫隙」可以插入棒子。
* | * | * | * | * | * | * | * | * | * | * | *
每一個縫隙,我們可以選擇插入一個棒子,或者不插入。
例如:
- 不插入任何棒子:
*************(代表 13) - 在第一個縫隙插入棒子:
* | ***********(代表 1 + 12)
第 2 題10 分
If and is composite, then there is a prime such that . Please prove it using the well-ordering principle.
登入後即可作答並保存紀錄。
核心觀念
本題旨在考查數論的基本性質與集合論中的**良序原理(Well-Ordering Principle)**之應用。關鍵概念與定義如下:
- 合數(Composite Number)定義:若正整數 不是質數,則稱為合數。即存在正整數 使得 且 。
- 良序原理(Well-Ordering Principle, WOP):正整數集合 的任意非空子集,都必定包含一個最小元素(Least Element)。亦即若 且 ,則存在 使得對所有 ,均滿足 。
- 整除的遞移律(Transitivity of Divisibility):設 ,若 且 ,則 。
- 質數(Prime Number)定義:大於 1 的正整數 ,若其正因數僅有 1 與 本身,則 稱為質數。
解題方法
本題要求的證明切入點為:定義一個由 的真因數所構成的集合,透過良序原理確保該集合存在最小元素,再利用反證法證明此最小元素必然為質數。
關鍵證明步驟與推導過程如下:
證明:
步驟一:構造集合
定義集合 為 所有大於 1 且小於 的正因數所組成的集合:
步驟二:驗證集合 非空且為正整數子集
已知 且 為合數,根據合數的定義,存在至少一個正整數 滿足 且 。
因此 ,可得 ( 為非空集合)。又由定義可知 。
步驟三:套用良序原理
因為 是正整數集合 的非空子集,根據良序原理, 必定包含一個最小元素,設此最小元素為 。
即 ,且對所有 ,皆滿足 。
第 3 題10 分
For distinct primes , let .
(a) [5%] What is ?
(b) [5%] If is the closed binary operation defined by , does have an identity element?
登入後即可作答並保存紀錄。
核心觀念
-
算術基本定理(Fundamental Theorem of Arithmetic)與乘法原理
- 任何大於 的自然數,均可唯一分解為質因數的乘積。若 為互異質數,則每一個有序對 所對應的整數 皆為唯一相異。
- 依據計數原理中的乘法原理,有限集合中相異元素個數等於各獨立選項目數的乘積。
-
代數結構:二元運算與單位元(Identity Element)
- 設 為一集合, 為定義在 上的封閉二元運算。若存在一元素 ,使得對所有 ,皆滿足:
則稱 為運算 在集合 中的單位元。 - 於本題中,,故 為單位元意指對所有 ,均有 。
- 設 為一集合, 為定義在 上的封閉二元運算。若存在一元素 ,使得對所有 ,皆滿足:
解題方法
(a) 計算集合 的元素個數
- 集合 的元素型態為 ,其中 ,。
- 因為 為互異質數,根據算術基本定理,不同的指數組合 定會產生不同的整數值 。
- 指數 的可選取個數為 種。
- 指數 的可選取個數為 種。
- 由乘法原理,集合 的元素總數為:
(b) 判斷 是否存在單位元
- 若存在單位元 ,根據單位元定義,必須對所有 均滿足 。
- 由數論性質可知:(即 能整除 )。
- 這代表單位元 必須是集合 中所有元素的倍數。
- 設 ,其中 且 。
- 取集合 中的極大元素 ,若要使 ,則 的質因數指數必須滿足 且 。
第 4 題10 分
For , let , where . How many strings in have length 6?
登入後即可作答並保存紀錄。
核心觀念
-
克萊尼星號集 (Kleene Star):
對於字母集 上的語言 ,其克萊尼星號集 定義為由 中元素經由有限次連接(concatenation)所構成的所有字串集合,即:
-
唯一分解性 (Unique Factorization Property):
在進行計數前,需確認 中字串的連接是否具備唯一可拆解性。由於 中 長度為 2 且以0開頭, 長度為 1 且以1開頭:- 任意字串 由左至右掃描時,只要遇到
0,其後方必須緊接一個1以組成積木01; - 遇到的單獨
1則必定為積木1。
因此 中每一個字串均對應到唯一的積木組合序列,不存在歧義(Ambiguity)。
- 任意字串 由左至右掃描時,只要遇到
-
分割數與費氏數列 (Compositions & Fibonacci Sequence):
將總長度 拆解為若干個長度為 1(積木 )與長度為 2(積木 )的組合問題,可等價於鋪磚問題(Tiling Problem),其計數遞迴式正好對應費氏數列。
解題方法
本題求解 中長度為 6 的字串個數,提供 組合計數法 與 遞迴關係式法 兩種標準解法:
方法一:組合計數法(按積木數量討論)
設形成長度為 6 的字串中,使用積木 (長度 2)的數量為 ,使用積木 (長度 1)的數量為 。
長度限制條件為:
對非負整數解 進行分類討論並計算其相異排列數:
-
當 時:
,即由 6 個積木 組成。
排列數為 種。
字串:111111 -
當 時:
,即由 1 個積木 與 4 個積木 組成(共 5 個積木)。
排列數為 種。
字串:011111,101111,110111,111011,111101 -
當 時:
,即由 2 個積木 與 2 個積木 組成(共 4 個積木)。
排列數為 種。
字串:010111,011011,011101,101011,101101,110101
第 5 題10 分
Find the generating function for the number of integer solutions to the equation , where , , , .
登入後即可作答並保存紀錄。
各變數的生成函數為
故總生成函數為
第 6 題10 分
If a fair die is rolled for 15 times, what is the probability that the sum of the rolls is 43?
登入後即可作答並保存紀錄。
令第 次點數為 ,設 ,則 ,且
利用容斥原理,符合條件的序列數為
第 7 題10 分
Solve the following recurrence relation. , , , .
登入後即可作答並保存紀錄。
核心觀念
本題考查**二階常係數非齊次線性遞迴關係式(Second-Order Linear Non-Homogeneous Recurrence Relation with Constant Coefficients)**的求解。
主要涵蓋以下關鍵定義與公式:
- 通解結構(General Solution Structure):
非齊次遞迴關係式的通解 可拆解為齊次解 與特解 之和:
- 特徵方程式與齊次解(Characteristic Equation & Homogeneous Solution):
對應的齊次遞迴關係式為 ,其特徵方程式為:
解得相異實根 後,齊次解形式為 。 - 未定係數法求特解(Method of Undetermined Coefficients):
非齊次項為 。當底數 不是特徵根時,可假設特解形式為 ,代回原遞迴關係式求解未定係數 。 - 初始條件代入(Initial Conditions):
將通解帶入初始條件 ,建立二元一次聯立方程組求解未定常數 。
解題方法
步驟一:求解齊次解
將原遞迴關係式之非齊次項置零,得到齊次關係式:
寫出其特徵方程式並進行因式分解:
求得特徵根為 。
因此,齊次解形式為:
步驟二:求解特解
非齊次項為 。
比較非齊次項底數 與特徵根 ,可知 並非特徵根。
因此,假設特解形式為:
將 代回原遞迴關係式 :
等式兩邊同除以 展開:
故特解為:
步驟三:組合通解並套用初始條件
通解 為齊次解與特解之和:
帶入初始條件 與 :
- 當 時:
- 當 時:
第 8 題10 分
(Algorithm Points) [10%] Please describe the algorithm of Heap Sort and analyze its time complexity in detail.
登入後即可作答並保存紀錄。
核心觀念
本題考查**堆積排序(Heap Sort)**的演算法流程與時間複雜度之數學推導。主要涵蓋以下核心觀念與定義:
- 最大堆積(Max-Heap):一種結構上符合完全二元樹(Complete Binary Tree),且滿足**最大堆積屬性(Max-Heap Property)**的資料結構。亦即對任意非根節點 ,其父節點之鍵值恆不小於該節點鍵值:
- 陣列儲存表示法(Array Representation):使用一維陣列 儲存二元樹,對於索引為 的節點:
- 父節點索引:
- 左子節點索引:
- 右子節點索引:
- 關鍵操作:
Max-Heapify:下沉調整單一節點,維護最大堆積屬性。Build-Max-Heap:將無序陣列由下而上建立為最大堆積。Heap-Sort:利用最大堆積持續提取最大值進行排序。
解題方法
一、 演算法詳細描述 (Algorithm Description)
堆積排序主要由三個核心步驟/程序組成:
-
維護堆積屬性 (
Max-Heapify(A, i)):- 假設以 與 為根的子樹皆已滿足最大堆積屬性,但 可能小於其子節點。
- 比較 、 與 的數值,找出最大值所在索引 。
- 若 ,則將 與 交換,並對索引 遞迴呼叫
Max-Heapify,使換下去的元素持續下沉至正確位置。
-
建立最大堆積 (
Build-Max-Heap(A)):- 對於長度為 的陣列,所有索引在 的節點皆為葉節點(Leaf Nodes),單獨的葉節點自然滿足最大堆積屬性。
- 從最後一個非葉節點 開始倒數至 ,對每個節點依序呼叫
Max-Heapify(A, i),採用由下而上(Bottom-up)方式構建出完整的最大堆積。
-
執行排序 (
Heap-Sort(A)):- 首先呼叫
Build-Max-Heap(A)將輸入陣列構造成最大堆積,此時根節點 即為全陣列最大值。 - 執行 次迴圈:
- 將根節點 與當前堆積最後一個元素 對調,此時最大值已被放置於陣列最終正確位置。
- 將堆積大小減 (
heap_size = heap_size - 1),以排除已排序好的末端元素。 - 對新的根節點呼叫
Max-Heapify(A, 1)重新恢復最大堆積屬性。
- 首先呼叫
二、 關鍵虛擬碼 (Pseudocode)
Max-Heapify(A, i):
l = Left(i)
r = Right(i)
if l <= heap_size and A[l] > A[i]:
largest = l
else:
largest = i
if r <= heap_size and A[r] > A[largest]:
largest = r
if largest != i:
swap A[i] with A[largest]
Max-Heapify(A, largest)
Build-Max-Heap(A):
heap_size = A.length
for i = floor(A.length / 2) down to 1:
Max-Heapify(A, i)
Heap-Sort(A):
Build-Max-Heap(A)
for i = A.length down to 2:
swap A[1] with A[i]
heap_size = heap_size - 1
Max-Heapify(A, 1)
三、 時間複雜度詳細推導 (Time Complexity Analysis)
1. Max-Heapify 之時間複雜度
對於一個包含 個節點的堆積,以節點 為根的子樹大小最大不會超過 (發生在最底層剛好填滿一半的情況)。
其執行時間遞迴關係式為:
由主定理(Master Theorem)可得其最壞時間複雜度為 。若以節點高度 表示,下沉最多走 層,時間複雜度為 。
2. Build-Max-Heap 之時間複雜度(關鍵精準推導)
粗略估算為 ,但此估算過於鬆散。經精準計算:
- 一個包含 個節點的完全二元樹,高度為 的節點數量最多為 。
- 樹的高度 。
第 9 題10 分
(Algorithm Points) [10%] Given a knapsack with maximum capacity Q and a set L consisting of n items, where each item i has weight wᵢ and benefit value aᵢ. Please describe an algorithm in detail based on dynamic programming for packing the items in a knapsack to achieve a maximum total benefit value and analyze the time complexity of the algorithm. (wᵢ, aᵢ, n, and Q are integer values.)
登入後即可作答並保存紀錄。
核心觀念
- 0-1 背包問題(0-1 Knapsack Problem):
本題為典型的 0-1 背包問題。在總重量不超過背包最大容量 的限制下,從 個物品中選擇一組物品組合,使總效益價值(Benefit Value)最大化。每個物品只有「選(1)」或「不選(0)」兩種選擇,不可分割亦不可重複選取。 - 動態規劃(Dynamic Programming, DP):
解決此問題需滿足動態規劃的兩大核心特性:- 最佳子結構(Optimal Substructure):原問題的最佳解可由規模較小的子問題最佳解組合而成。考慮前 個物品在容量限制 下的最大效益,取決於前 個物品在容量 或 下的最佳解。
- 重疊子問題(Overlapping Subproblems):求解過程中會重複調用相同的子狀態。利用表格(DP Table)記錄已計算過的子問題解答,可避免重複計算。
解題方法
1. 狀態定義(State Definition)
定義二維陣列 :
從前 個物品(物品 至 )中進行選擇,且背包容量上限為 時,所能獲得的最大總效益價值。
其中索引範圍為:
目標求解值即為 。
2. 狀態轉移方程式(Recurrence Relation)推導
針對第 個物品(重量為 ,效益價值為 ),依據當前背包容量 分為兩種情況:
-
情況一:容量不足以裝下第 個物品(即 )
無法選擇第 個物品,故最大效益等於前 個物品在容量 下的最佳解:
-
情況二:容量足夠裝下第 個物品(即 )
此時決策分為「不選」與「選擇」第 個物品,取兩者之最大值:- 不選擇第 個物品:效益為 。
- 選擇第 個物品:獲得第 個物品的效益 ,再加上前 個物品在剩餘容量 下的最大效益,即 。
綜合以上,得到完整轉移方程式:
3. 初始條件(Base Cases)
- (對所有 ):沒有物品可選時,總效益為 。
- (對所有 ):背包容量為 時,無法裝入任何物品,總效益為 。
4. 演算法虛擬碼(Pseudocode)
第 10 題10 分
(Algorithm Points) [10%] Please describe the algorithm of minimum spanning tree and analyze its time complexity in detail.
登入後即可作答並保存紀錄。
核心觀念
本題考驗圖形理論(Graph Theory)與演算法設計中「最小生成樹(Minimum Spanning Tree, MST)」的經典演算法及其時間複雜度分析。
-
最小生成樹(MST)定義:
給定一個連通且帶權重的無向圖 ,其中 為頂點集合, 為邊集合,邊權重函數為 。 的生成樹(Spanning Tree)為包含 中所有頂點且無環的連通子圖 ,其中 且 。當 的總邊權重 達最小時,稱 為圖 的最小生成樹(MST)。 -
貪婪選擇理論基礎:
MST 演算法的核心立基於割定理(Cut Property):- 割定理(Cut Property):設 為頂點集的一個真子集,劃分 稱為圖 的一個割(Cut)。若邊 橫跨該割(即 ),且 為所有橫跨該割的邊中權重最小者(Light Edge),則邊 必定屬於某棵最小生成樹。
- 環定理(Cycle Property):對於圖 中的任意簡單環路 ,環路中權重最大的邊必定不屬於任何最小生成樹(在邊權重嚴格相異的前提下)。
解題方法
求解最小生成樹最著名的兩大經典貪婪演算法分別為 Kruskal 演算法與 Prim 演算法。以下分別詳細說明其運作機制與時間複雜度推導。
一、 Kruskal 演算法 (Kruskal's Algorithm)
1. 演算法步驟說明
Kruskal 演算法採用「以邊為中心(Edge-based)」的貪婪策略:
- 將圖中所有邊 依權重由小到大排序:。
- 初始化生成樹邊集合 。
- 為每個頂點 建立獨立的不相交集合(Disjoint Set)。
- 依序檢查排序後的每條邊 :
- 使用
Find-Set(u)與Find-Set(v)檢查 與 是否屬於同一個連通分量。 - 若屬於不同分量(不會形成環),則將 加入 ,並執行
Union(u, v)合併兩集合。 - 若屬於相同分量(加入會形成環),則捨棄邊 。
- 使用
- 當 時演算法結束,回傳 。
2. 關鍵虛擬碼 (Pseudo-code)
MST-KRUSKAL(G, w)
A = empty_set()
for each vertex v in G.V:
MAKE-SET(v)
sort the edges of G.E into nondecreasing order by weight w
for each edge (u, v) in G.E, taken in nondecreasing order:
if FIND-SET(u) != FIND-SET(v):
A = A union {(u, v)}
UNION(u, v)
return A
3. 詳細時間複雜度推導
- 初始化集合:執行 次
Make-Set,時間複雜度為 。 - 邊的排序:對 條邊進行排序,使用高效比較排序(如 Quick Sort / Merge Sort),時間複雜度為 。
- Disjoint-Set 操作:
- 迴圈最多遍歷 條邊,共執行最多 次
Find-Set與 次Union。 - 使用「路徑壓縮(Path Compression)」與「按秩合併(Union by Rank)」優化的 Disjoint-Set,單次操作的均攤時間為 ,其中 為反阿克曼函數(Inverse Ackermann Function),實務上 。
- 此階段總時間複雜度為 。
- 迴圈最多遍歷 條邊,共執行最多 次
- 總時間複雜度:
由於在簡單圖中 ,可得 。
因此,Kruskal 演算法的時間複雜度寫為 。
二、 Prim 演算法 (Prim's Algorithm)
1. 演算法步驟說明
Prim 演算法採用「以頂點為中心(Vertex-based)」的貪婪策略:
- 任選一頂點 作為樹的根節點。
- 維護頂點集合 (已納入 MST 的頂點)與優先佇列 (未納入 MST 的頂點 )。
- 每個頂點 記錄
key[v]( 到當前 MST 集合 的最短距離)與$\pi[v]$( 在 MST 中的父節點)。初值設key[r] = 0,其餘頂點為 。 - 當 不為空時:
- 從 中取出
key值最小的頂點 (Extract-Min),將其加入 。 - 對於 的每一個相鄰頂點 :若邊權重 ,則更新 並設定 (執行
Decrease-Key操作)。
- 從 中取出