113 年 國立中山大學資訊工程學系資訊安全碩士班《離散數學與演算法》
第 1 題10 分
- [10%] In how many ways can Richard assign 22 students in four classrooms so that there are at least
three students in a classroom? (a student assigned different seats is considered as different cases in a
classroom)
登入後即可作答並保存紀錄。
設四間教室的人數為 ,其中 且
令 ,則
故人數分配方式數為
第 2 題10 分
- [10%] How many positive integers up to 188,071 that are relatively prime to 188,071?
登入後即可作答並保存紀錄。
核心觀念
- 歐拉函數(Euler's Totient Function):設 為正整數,歐拉函數 定義為不超過 且與 互質(relatively prime, 即 )的正整數個數。
- 算術基本定理與質因數分解(Prime Factorization):任何大於 1 的正整數皆可唯一表示為質數的乘積。若 的質因數分解式為:
其中 為相異質數,。 - 歐拉函數計算公式:
特別地,當 為無平方因子數(square-free number,即所有 )時,公式簡化為:
解題方法
本題欲求小於或等於 且與 互質的正整數個數,即計算 的值。解題步驟分為「質因數分解」與「帶入歐拉函數公式」兩階段:
- 對 進行質因數分解:
利用試除法(Trial Division)從小質數開始檢驗:- 快速排除 (皆無法整除 )。
- 試除質數 :
得 為第一質因數。 - 對商數 繼續試除質數:
- (無法整除)
- 試除質數 :
得 為第二質因數。
- 對商數 繼續試除質數:
第 3 題10 分
- (a) [10%] In how many ways can Peter select n candies from a large supply of four different kinds of
candies (all of the same size) if the selection must include an even number of one specific type of
candies?
(b) [10%] In how many ways can Peter select n candies from a large supply of three different kinds
of candies (all of the same size) if the selection must include odd numbers of two specific types of
candies?
登入後即可作答並保存紀錄。
核心觀念
本題屬於**離散數學中的組合計數(Combinatorics)與生成函數(Generating Functions)**考題,具體考點包含:
- 重複組合(Combinations with Repetition)與限制條件:在非負整數解的限制下,計算將 個相同的物件分給不同種類的分配方式。
- 一般生成函數(Ordinary Generating Functions, OGF):將種類選擇的限制條件轉換為級數相乘,再利用部分分式拆解法(Partial Fraction Decomposition)求出 的係數 。
- 二項式定理與負整數次方展開(Binomial Expansion with Negative Exponents):
解題方法
(a) 詳解推導
題目要求從 4 種不同的糖果中挑選 顆,其中指定 1 種糖果的數量必須為偶數(),其餘 3 種無限制()。
方法一:一般生成函數法(標準正攻法)
設 4 種糖果分別為 ,並設 的選取數量必須為偶數。
-
建立各種類的生成函數:
- 糖果 (偶數顆):
- 糖果 (無限制):
-
建立整體生成函數 :
-
進行部分分式拆解(Partial Fraction Decomposition):
設
解得各項係數為:
故 可表示為:
-
提取 的係數 :
利用廣義二項式定理,可得:
因此:
-
化簡為多項式閉形式(Closed Form):
將組合項化簡並通分(分母為 48):
加總整理可得:
方法二:分類討論法(重複組合加總驗證)
設糖果 取 顆(),則其餘 3 種糖果共需分得 顆。
利用重複組合公式 ,總方法數為:
(b) 詳解推導
題目要求從 3 種不同的糖果中挑選 顆,其中指定 2 種糖果的數量必須為奇數(),剩餘 1 種無限制()。
方法一:一般生成函數法(標準正攻法)
設 3 種糖果分別為 ,其中 的選取數量必須為奇數。
-
建立各種類的生成函數:
- 糖果 (奇數顆):
- 糖果 (無限制):
-
建立整體生成函數 :
-
進行部分分式拆解:
將 拆解為:
解得各項係數為:
即:
第 4 題10 分
- (10%) Find the generating function for the sequence 1, 2, 3, 4, 5, 5, 5, ....
登入後即可作答並保存紀錄。
設普通生成函數為
其中 。則
第 5 題5 分
- A ship carries 60 food cans, 15 of each the chicken, beef, pork, and fish. Fifteen of these cans are
placed to a lifeboat in order to supply foods for the rescue event.
(a) [5%] How many possible choices that contains an even number of beef cans and an odd number
of chicken cans?
(b) [5%] How many possible choices that contains at least three pork cans or no pork cans at all?
登入後即可作答並保存紀錄。
核心觀念
本題屬於離散數學組合學(Combinatorics)中「從多種相異類別中選取物件」的**重複組合(Combinations with Repetition)**問題。
在離散數學考題標準規範中,當題目給定 4 種食品罐頭(雞肉、牛肉、豬肉、魚肉)並要求選取指定數量時,同種類的罐頭視為同型(Identical),種類之間為相異(Distinct)。
設選取之雞肉罐頭數量為 、牛肉罐頭數量為 、豬肉罐頭數量為 、魚肉罐頭數量為 。因為救生艇需選取 15 個罐頭,且每種罐頭儲備總數皆為 15 個(即單一種類選取的上限為 15,絕不超越儲備上限),故題意等價於求解非負整數解 的組數:
本題主要運用之定義與定理:
- 重複組合公式:將 個相同物件分配給 個相異類別(即方程式 之非負整數解個數)為:
- 奇偶性與範圍限制處理:
- 奇偶性限制:採用變數代換 或針對奇數項分類加總。
- 範圍限制:採用直接分類討論法(Direct Case Analysis)或反面扣除法(Complementary Counting)。
解題方法
(a) 包含偶數個牛肉罐頭與奇數個雞肉罐頭之組合數
限制條件:
- 牛肉罐頭數 為偶數:
- 雞肉罐頭數 為奇數:
- 豬肉與魚肉罐頭數
推導步驟:
- 將雞肉罐頭可能出現的奇數 進行分類。令 ,其中 必為偶數,。
- 原方程式化簡為 。
- 設 (),則 。
- 對於固定的 與 , 的非負整數解個數為:
- 固定 (其中 ),讓 從 累加至 :
- 的可能取值對應 。
- 加總所有可能之 :
(b) 包含至少三個豬肉罐頭或完全沒有豬肉罐頭之組合數
限制條件:
- 豬肉罐頭數 或
- 罐頭總數 ,且
推導步驟(提供兩種標準解法):
- 方法一:直接分類討論法
- 事件一:完全沒有豬肉罐頭 ()
方程式簡化為 ,由 3 種類中選取 15 個罐頭:
- 事件一:完全沒有豬肉罐頭 ()
第 6 題10 分
- [10%] An alphabet ∑ consists of the five numeric characters 1, 2, 3, 4, 5, and the six alphabetic
characters a, b, c, d, e, f. Find and solve a recurrence relation for the number of words of length n (in
∑*), where there is no consecutive (identical or distinct) alphabetic characters.
登入後即可作答並保存紀錄。
核心觀念
字母表 中有:
- 數字字符: 個;
- 英文字母: 個。
限制條件是:不能出現連續的兩個 alphabetic characters,且不論兩個字母是否相同,只要相鄰皆不允許。因此合法字串的形式必須符合:
令 表示長度為 的合法字串數量。可利用字串最後一個字符的類型建立遞迴關係。
解題方法
將長度為 的合法字串分成兩類:
- :最後一個字符是數字;
- :最後一個字符是字母。
因此:
以數字結尾
若最後一個字符是數字,前面長度 的部分可以是任意合法字串,最後再選擇 個數字之一:
以字母結尾
若最後一個字符是字母,由於不能有連續字母,倒數第二個字符必須是數字。
前面長度 的部分有 種,接著選一個數字,再選一個字母,因此:
合併兩類:
所以得到遞迴關係:
初始條件為:
空字串屬於 ,因此長度為 時有 種。
長度為 時可以選擇任意一個字符:
故完整遞迴關係為:
解遞迴關係
其特徵方程為:
解得:
令:
因此通解為:
利用初始條件:
以及:
解得:
第 7 題10 分
- (Algorithm points) [10%] Please express the algorithm of Quick Sort and analyze its time complexity
in detail.
登入後即可作答並保存紀錄。
核心觀念
快速排序法(Quick Sort)是一種基於**分治法(Divide and Conquer)**的高效排序演算法。其核心思想為:
- 分割(Partition):從陣列中挑選一個元素作為「基準值」(Pivot),並重排陣列,使得所有小於基準值的元素皆位於基準值左側,所有大於或等於基準值的元素皆位於右側。
- 遞迴求解(Conquer):分別對基準值左側與右側的子陣列遞迴執行 Quick Sort。
- 合併(Combine):由於子陣列採原地(In-place)排序,當子陣列完成排序時,整體陣列即已完全有序,無需額外的合併步驟。
本題主要考驗演算法邏輯寫法、遞迴關係式(Recurrence Relation)之建立,以及運用**主定理(Master Theorem)與代數展開法(Algebraic Induction/Substitution Method)**進行最差、最佳與平均時間複雜度(Time Complexity)之推導。
解題方法
一、 Quick Sort 演算法虛擬碼 (Pseudo-code)
QuickSort(A, low, high):
if low < high:
// q 為 Partition 後 Pivot 的最終正確位置 index
q = Partition(A, low, high)
QuickSort(A, low, q - 1) // 遞迴排序左半部
QuickSort(A, q + 1, high) // 遞迴排序右半部
Partition(A, low, high):
x = A[high] // 選擇最後一個元素作為 Pivot
i = low - 1 // i 為較小元素的邊界指標
for j = low to high - 1:
if A[j] <= x:
i = i + 1
swap A[i] with A[j]
swap A[i + 1] with A[high] // 將 Pivot 置於正確分割位置
return i + 1
二、 時間複雜度詳細分析 (Time Complexity Analysis)
設陣列長度為 。Partition 步驟需要掃描整個陣列一次,其時間複雜度為 。整體時間複雜度取決於每次 Partition 劃分出的兩個子陣列大小。
1. 最佳情況(Best-case Complexity):
- 條件:每次 Partition 都能將長度為 的陣列極度均勻地平分為大小約為 與 的兩半。
- 遞迴關係式:
- 詳細推導(套用主定理 Master Theorem):
- 形式:,其中 。
- 計算 。
- 由於 ,符合主定理 Case 2。
- 得證最佳時間複雜度 。
2. 最差情況(Worst-case Complexity):
- 條件:每次選取的 Pivot 皆為當前陣列的最大值或最小值(例如:輸入已排序或反向排序,且固定選取首尾為 Pivot),導致分割出的兩個子陣列長度分別為 與 。
- 遞迴關係式:
- 詳細推導(代數級數展開):
- 由等差級數求和可知最高次項為 ,故最差時間複雜度 。
3. 平均情況(Average-case Complexity):
第 8 題10 分
- (Algorithm points) [10%] Please express the algorithm of Huffman coding and analyze its time complexity
in detail.
登入後即可作答並保存紀錄。
核心觀念
霍夫曼編碼(Huffman Coding) 是一種用於無損資料壓縮的貪婪演算法(Greedy Algorithm),其目標是建構一套最佳前綴碼(Optimal Prefix Code),使得給定檔案或文本的總變長編碼長度達到最短。
- 前綴碼(Prefix Code / Prefix-free Code):
任何字元的編碼皆不能是另一個字元編碼的前綴。此性質保證了解碼時的唯一可解碼性(Unique Decipherability),解碼過程無需分隔符號即可順暢進行。 - 最佳樹結構(Optimal Binary Tree):
編碼對應至一棵滿二元樹(Full Binary Tree),字元皆位於葉節點(Leaf Nodes)。字元出現頻率越高,其在樹中的深度越淺(編碼越短);頻率越低,深度越深(編碼越長)。 - 加權外路徑長(Weighted External Path Length):
若字元集為 ,字元 的出現頻率為 ,其在二元樹 中對應葉節點的深度為 (亦即編碼長度),則總編碼成本為:
霍夫曼演算法保證能找到使 達到最小值的樹結構。
解題方法
1. 演算法描述與虛擬碼(Pseudocode)
霍夫曼演算法採用**自底向上(Bottom-up)**的貪婪策略:每次從當前的節點集合中,選出出現頻率最小的兩個節點合併為一棵新子樹,新節點的頻率為該兩節點頻率之和,再將新節點放回集合中。重複此過程直至只剩下一個根節點為止。
為了有效率地找出頻率最小的節點,演算法使用最小優先佇列(Min-Priority Queue / Min-Heap) 來維護所有節點。
HUFFMAN(C)
1. n = |C|
2. Q = C // 將所有字元節點放入最小優先佇列 Q 中(以頻率 f[c] 為鍵值)
3. for i = 1 to n - 1 do
4. allocate a new node z
5. z.left = x = EXTRACT-MIN(Q) // 取出頻率最小的節點 x
6. z.right = y = EXTRACT-MIN(Q) // 取出頻率次小的節點 y
7. z.freq = x.freq + y.freq // 新節點頻率為兩者之和
8. INSERT(Q, z) // 將新內部節點 z 放回最小優先佇列 Q
9. return EXTRACT-MIN(Q) // 傳回二元樹之根節點
2. 詳細時間複雜度分析(Detailed Time Complexity Analysis)
設字元集 包含 個不同的字元(即 ):
- 初始化優先佇列(Line 1–2):
- 將包含 個字元的陣列建立成一個 Min-Heap。
- 使用標準的
BUILD-MIN-HEAP演算法,時間複雜度為 。(若逐一插入 次則為 ,但不影響最終的整體漸進複雜度)。
第 9 題10 分
- (Algorithm points) [10%] Let T be a complete n-ary tree of height h with m leaves. Prove that m≤
nh and h≥ [logn m].
登入後即可作答並保存紀錄。
高度為 的完全 元樹,每個內部節點至多有 個子節點,因此第 層至多有 個節點。葉節點數在所有葉節點皆位於第 層時最多,故
假設 ,兩邊取以 為底的對數: