112 年 國立中山大學資訊工程學系資訊安全碩士班《離散數學與演算法》
第 1 題10 分
Two n-digital integers (leading zeros allowed) are considered equivalent if one is a rearrangement of the other. (E.g., 305697, 079563, and 567930 are considered equivalent six-digital integers.)
(a) How many six digital integers are not equivalent?
(b) If the digitals 3, 5, and 7 can appear at most once, how many nonequivalent six-digital integers are there?
登入後即可作答並保存紀錄。
核心觀念
本題主要考驗離散數學中的重複組合(Combination with Repetition / Multiset)與計數原理。
-
等價關係(Equivalence Relation)與多重集(Multiset):
題目定義:若一個 位數整數可以透過另一個整數的數字重排(Rearrangement)而得到,則兩數視為等價(Equivalent)。
這意味著:決定一個 位數整數所在的「等價類(Equivalence Class)」,只需考慮該整數中各數字()出現的次數,而不需考慮數字出現的順序。因此,「互不等價的 位數整數個數」即等於「從 10 種數字 中,可重複地選出 個數字所構成的不同多重集數量」。 -
重複組合公式:
從 種不同的元素中,可重複地取 個元素組合,其種類數記為 或 ,可轉換為普通組合數 :
-
受限重複組合與分類討論(或生成函數法):
當部分元素有次數限制(例如出現至多一次)時,可利用**分類討論法(按限制元素的總選取次數分類)或生成函數(Generating Function)**求得指定次數的係數。
解題方法
(a) 小題推導:計算互不等價的 6 位數整數個數
-
問題轉化:
位數 。可用的數字集合為 ,共 10 種數字。
設數字 出現的次數為 (其中 ),由於數字可包含前導零,且不考慮順序,故求互不等價的 6 位數整數個數,等價於求下列方程式非負整數解的組數:
-
步驟與計算:
此為標準重複組合問題,從 10 種數字中可重複地選取 6 個數字:
利用組合數展開計算:
(b) 小題推導:數字 3、5、7 至多出現一次時的個數
-
條件分析:
數字集合分為兩類:- 受限數字:,共 3 種數字,出現次數 。
- 無限制數字:,共 7 種數字,出現次數 。
需滿足總位數:
-
解題步驟:按受限數字的總選取個數 分類討論
設從受限數字集合 中選出的數字種類總數為 ():
第 2 題10 分
Find the exponential generating function for the sequence 0!, 1!, 2!, 3!, ....
登入後即可作答並保存紀錄。
核心觀念
本題考查**指數型生成函數(Exponential Generating Function, EGF)**的定義及其級數求和。
-
指數型生成函數(EGF)定義:
對於數列 ,其指數型生成函數 定義為:
-
無窮等比級數求和公式:
當 時,公比為 、首項為 的無窮等比級數收斂至閉合形式(Closed Form):
解題方法
步驟一:確定數列通項
題目給定的數列為 ,其通項公式可寫為:
步驟二:代入指數型生成函數定義
將 代入 EGF 的定義式中:
步驟三:約分化簡
由於對所有 , 皆不為 ,分子與分母的 可以直接相消:
第 3 題10 分
There are 65 boxes in an office and the size of each box is different. Assume that no two boxes have the same size. How many boxes at least can be used together to pack a stuff that is smaller than the smallest box (a box of larger size can contain a smaller one)?
登入後即可作答並保存紀錄。
將箱子依大小排列為
物品小於最小箱子 ,故可放入 ;又因較大箱子可容納較小箱子,因此可逐層套裝:
第 4 題10 分
How many positive integers n divide 69373n + 342247?
登入後即可作答並保存紀錄。
核心觀念
-
整除的同餘性質(Divisibility Properties)
若 皆為整數且 ,根據整除的線性組合性質:
因為對任意整數 , 恆成立。 -
算術基本定理與因數個數公式(Fundamental Theorem of Arithmetic)
任何大於 1 的正整數 都可以唯一分解為質因數的乘積。若 的質因數分解式為:
則 的所有正因數個數 計算公式為:
-
質數判定試除法(Trial Division)
欲檢驗自然數 是否為質數,僅需測試不大於 的所有質數是否能整除 。
解題方法
步驟一:簡化整除條件
題目要求找出能使 成立的正整數 個數。
將分子拆解為兩項:
由於 為整數,若要使上式結果為整數,當且僅當 能整除 (即 )。
因此,本題等價於求正整數 的正因數個數。
步驟二:對 進行質因數分解
- 計算開平方根以確定試除上限:
- 由小到大測試質因數:
- 排除 :尾數非偶數(非 2 的倍數)、數字和 (非 3 的倍數)、尾數非 (非 5 的倍數)。
- 測試 :均無法整除。
- 測試質數 :
成功分解出質因數 。
步驟三:檢驗商數 是否為質數
- 計算開平方根上限:
- 檢驗小於 的所有質數:
第 5 題10 分
Find the generating function for the number of partitions of the nonnegative integer n into summands, where each summand must appear an odd number of times.
登入後即可作答並保存紀錄。
核心觀念
本題考查**組合數學(Combinatorics)中的整數拆解(Integer Partition)與生成函數(Generating Function)**之建立。
- 整數拆解(Partition):將非負整數 表示為若干個正整數之和(不考慮加數的順序),這些被相加的正整數稱為加數(Summands / Parts)。
- 生成函數建立原則(Product Rule for Generating Functions):
對於每個可選的正整數加數 ,若其出現次數(重數 multiplicity) 受限於某個集合 ,則加數 所對應的生成函數因子為:
根據組合計數的乘法原理,整體整數拆解數的生成函數 即為所有加數因子的無窮乘積:
- 無窮等比級數求和公式:
當 時,首項為 、公比為 的無窮等比級數和為:
解題方法
步驟一:分析個別加數 的出現次數條件
題目限制「每個加數若出現,其出現次數必須為奇數次」。
對於任一給定的正整數加數 ():
- 加數 可以不出現(即出現 次,貢獻次方 )。
- 若加數 出現,則其出現次數 必須為奇數,即 (貢獻次方 )。
因此,加數 的可能出現次數集合為 。
步驟二:撰寫加數 的生成函數因子
將加數 對應的所有可能次方項相加,得到加數 的生成函數因子 :
步驟三:化簡單一因子
觀察 中從第二項開始的無窮級數 :
此級數為首項為 、公比為 的無窮等比級數。利用等比級數求和公式可得:
因此, 可化簡表示為:
步驟四:組合成全體生成函數
將所有正整數 的因子相乘,即可得非負整數 拆解為「每個加數出現奇數次」的拆解數生成函數 :
選項分析
本題為非選擇題(計算問答題)。為深化觀念,以下針對生成函數構造中各個代表項與常見錯誤型態進行結構解析與比對:
第 6 題10 分
Prove that the number of primes is infinite.
登入後即可作答並保存紀錄。
核心觀念
本題考查數論(Number Theory)中關於質數分佈的基本性質,核心知識點包含:
- 質數(Prime number)的定義:大於 的整數 ,若其正因數僅有 與 本身,則稱 為質數。
- 算術基本定理(Fundamental Theorem of Arithmetic)/ 質因數存在性:任何大於 的整數要麼本身是質數,要麼可以唯一分解為有限個質數的乘積。因此,任意整數 必存在至少一個質因數。
- 整數的可整除性(Divisibility)線性組合性質:若 能整除 且 能整除 (記作 且 ),則 必能整除兩者的線性組合 。特別地,。
- 反證法(Proof by Contradiction):假設欲證命題的反面成立,經由邏輯推導得出與已知定理或事實矛盾的結果,從而證明原命題必定成立。
解題方法
採用歐幾里得(Euclid)經典的反證法進行嚴嚴謹推導:
-
提出反證假設:
假設質數的數量是有限的(Finitely many),設全體質數共有 個,依從小到大的順序排列為:
其中 。 -
構造特殊整數:
定義整數 為所有已知質數的乘積再加上 :
-
分析 的質因數:
因為 ,所以 。
根據算術基本定理,整數 必存在至少一個質因數,記此質因數為 。 -
推導邏輯矛盾:
- 由於 已經包含全體質數,質數 必須是該列表中的某一個質數,即存在 使得 。
- 因為 是 的其中一個因數,故:
- 同時,由 是 的質因數可知:
第 7 題10 分
(Algorithm points) Please describe the algorithm of Tower of Hanoi using recursion and analyze its time complexity in detail.
登入後即可作答並保存紀錄。
核心觀念
河內塔(Tower of Hanoi)問題為經典的**遞迴(Recursion)與分治法(Divide and Conquer)**應用範例。
- 基本規則:
- 共有三根柱子:來源柱(Source, )、目標柱(Target, )、輔助柱(Auxiliary, )。
- 來源柱上有 個圓盤,由上至下依尺寸由小到大排列。
- 每次僅能移動一個圓盤,且在移動過程中,較大圓盤絕對不可疊放在較小圓盤之上。
- 分治策略:
- 將「搬動 個圓盤」的大問題,化簡為「搬動 個圓盤」的相同結構子問題。
- 複雜度分析基礎:
- 建立遞迴關係式(Recurrence Relation),並運用**代入展開法(Substitution Method)**精確求解移動次數與時間複雜度。
解題方法
1. 遞迴演算法邏輯與步驟
若要將 個圓盤從來源柱()借助輔助柱()搬移至目標柱():
- Base Case(基本情況):
當 時,直接將該圓盤從 搬移至 。 - Recursive Step(遞迴步驟):
- 步驟一:將最上方的 個圓盤從 移動至 (此時 為輔助柱)。
- 步驟二:將 上剩餘的最大圓盤(第 個)直接移動至 。
- 步驟三:將暫存在 的 個圓盤從 移動至 (此時 為輔助柱)。
2. 演算法虛擬碼(Pseudocode)
Algorithm Hanoi(n, Source, Target, Auxiliary):
if n == 1:
Move disk 1 from Source to Target
return
// 步驟一:將 n-1 個圓盤從 Source 移至 Auxiliary
Hanoi(n - 1, Source, Auxiliary, Target)
// 步驟二:將最大的第 n 個圓盤從 Source 移至 Target
Move disk n from Source to Target
// 步驟三:將 n-1 個圓盤從 Auxiliary 移至 Target
Hanoi(n - 1, Auxiliary, Target, Source)
3. 詳細時間複雜度推導 (Time Complexity Analysis)
設 為移動 個圓盤所需的總搬移次數(基本操作數)。
依據演算法的三大步驟,可建立遞迴關係式:
利用**反覆代入法(Repeated Substitution Method)**展開:
導出第 步展開的一般通式:
第 8 題10 分
(Algorithm points) Please describe the algorithm of Merge Sort and analyze its time complexity in detail.
登入後即可作答並保存紀錄。
核心觀念
Merge Sort(合併排序法)是經典的 Divide-and-Conquer(分治法) 演算法。其核心思想是將一個複雜的大問題遞迴地分割為若干個規模較小、結構相同的子問題,待子問題各自求解完成後,再將子問題的解答合併以求得原問題的最終解答。
描述 Merge Sort 並詳細分析其時間複雜度,主要涵蓋以下關鍵定義與分析工具:
- Divide-and-Conquer 三大階段:
- Divide(分割):將長度為 的未排序陣列從中間切開,拆分為兩個長度約為 的子陣列。
- Conquer(克服/遞迴排序):遞迴呼叫
MergeSort,分別對左半部與右半部的子陣列進行排序。 - Combine(合併/Merge):將兩個已經排序好的子陣列合併成一個整體排序完成的陣列。
- 遞迴關係式(Recurrence Relation):
將演算法執行時間表示為子問題時間與合併時間的遞迴式:
- 複雜度分析工具:
- 展開代換法(Substitution / Iterative Expansion Method)
- 遞迴樹法(Recursion Tree Method)
- 主定理(Master Theorem)
解題方法
1. Merge Sort 演算法描述與虛擬碼
Merge Sort 主要由兩個函數組成:主遞迴函數 MergeSort 與核心合併函數 Merge。
(1) MergeSort(A, low, high)
主函數負責界定陣列範圍,當範圍內元素多於 1 個時計算中點並發起遞迴呼叫,最後呼叫 Merge 進行合併。
MergeSort(A, low, high):
if low < high:
mid = low + (high - low) / 2 // 計算中間索引(避免溢位)
MergeSort(A, low, mid) // 遞迴排序左半部 A[low..mid]
MergeSort(A, mid + 1, high) // 遞迴排序右半部 A[mid+1..high]
Merge(A, low, mid, high) // 合併左右兩個已排序子陣列
(2) Merge(A, low, mid, high)
合併函數將兩個相鄰且已排序的子陣列 與 合併為單一排序陣列。利用雙指標(Two Pointers)分別指向兩子陣列開頭,比較元素大小後依序填入輔助陣列,最後複製回原陣列 。
Merge(A, low, mid, high):
n1 = mid - low + 1
n2 = high - mid
建立輔助陣列 L[0..n1-1] 與 R[0..n2-1]
for i = 0 to n1-1:
L[i] = A[low + i]
for j = 0 to n2-1:
R[j] = A[mid + 1 + j]
i = 0, j = 0, k = low
while i < n1 and j < n2:
if L[i] <= R[j]: // 條件包含等於 (<=) 以維持穩定度 (Stability)
A[k] = L[i]
i = i + 1
else:
A[k] = R[j]
j = j + 1
k = k + 1
while i < n1: // 複製左半部剩餘元素
A[k] = L[i]
i = i + 1
k = k + 1
while j < n2: // 複製右半部剩餘元素
A[k] = R[j]
j = j + 1
k = k + 1
2. 時間複雜度詳細推導
第一步:建立遞迴關係式 (Recurrence Relation)
設 為處理長度為 之陣列所需的總執行時間:
- Base Case:當 時,只需常數時間判斷邊界,故 。
- Recursive Case:當 時:
- Divide:計算中點 需要常數時間 。
- Conquer:遞迴排序兩個規模為 的子陣列,共需花費 時間。
- Combine:
Merge函數需要雙指標掃描並搬移 個元素,花費 時間。
綜合上述,遞迴關係式完整定義如下:
其中 為常數。
第二步:推導時間複雜度(提供三種嚴密推導方式)
推導方式一:展開代換法(Substitution / Iterative Expansion Method)
將遞迴式連續展開:
將其推廣至第 次展開:
當遞迴到達基底條件,即 時代入:
推導方式二:遞迴樹法(Recursion Tree Method)
構建遞迴結構樹並計算各層總工作量:
第 9 題10 分
(Algorithm points) Please describe the algorithm of Dijkstra algorithm and analyze its time complexity in detail.
登入後即可作答並保存紀錄。
核心觀念
-
單源最短路徑問題(Single-Source Shortest Path, SSSP):
給定一個權重圖 及源點 ,目標為求出從 到圖中所有頂點 的最短路徑權重之和。 -
貪婪選擇性質(Greedy-Choice Property)與最佳子結構(Optimal Substructure):
Dijkstra 演算法採用貪婪策略。演算法維持一個已確定最短路徑的頂點集合 ,在每一步選擇當前距離估計值最小且尚未納入 的頂點 ,將其納入集合 中。其正確性依賴於「最短路徑的子路徑亦為最短路徑」之最佳子結構性質。 -
鬆弛操作(Relaxation):
演算法更新頂點最短距離估計值的核心機制。對於任一條有向邊 ,若經過頂點 到達頂點 的路徑距離比當前記錄的距離更短,則更新 的距離估計值與前驅頂點:
-
非負權重限制(Non-negative Edge Weights):
Dijkstra 演算法的前提條件為所有邊的權重必須非負(即對所有 ,均滿足 )。若圖中含有負權邊,貪婪選擇機制將無法保證解的正確性。
解題方法
1. 演算法步驟描述
Dijkstra 演算法主要維護以下資料結構:
- :記錄從源點 到頂點 的當前最短距離估計值。
- :記錄最短路徑上頂點 的前驅頂點(用於重建路徑)。
- :存放已確定最短路徑的頂點集合。
- :以 為鍵值(Key)的最小優先佇列(Min-Priority Queue),包含所有 中的頂點。
詳細執行流程:
-
初始化步驟:
- 對所有頂點 ,設定 、。
- 將源點 的距離設為 。
- 初始化集合 。
- 將圖中所有頂點加入優先佇列 。
-
主迴圈執行:
- 當優先佇列 時,重複執行以下操作:
- 從 中取出具有最小 值的頂點 (
EXTRACT-MIN(Q))。 - 將頂點 加入集合 ()。
- 針對頂點 的每一個相鄰頂點 進行鬆弛操作:
若 ,則將 更新為 、將 設定為 ,並更新 在優先佇列 中的位置(DECREASE-KEY(Q, v, d[v]))。
- 從 中取出具有最小 值的頂點 (
- 當優先佇列 時,重複執行以下操作:
-
演算法虛擬碼(Pseudo-code):
DIJKSTRA(G, w, s)
1. INITIALIZE-SINGLE-SOURCE(G, s)
for each vertex v in G.V
d[v] = INF
pi[v] = NIL
d[s] = 0
2. S = empty_set
3. Q = G.V
4. while Q is not empty
5. u = EXTRACT-MIN(Q)
6. S = S union {u}
7. for each vertex v in G.Adj[u]
8. if d[v] > d[u] + w(u, v)
9. d[v] = d[u] + w(u, v)
10. pi[v] = u
11. DECREASE-KEY(Q, v, d[v])
2. 時間複雜度詳細分析
設 表示頂點個數, 表示邊的個數。
Dijkstra 演算法的總執行時間主要由優先佇列的三種操作決定:
INITIALIZE-SINGLE-SOURCE:需要 時間。EXTRACT-MIN操作:每個頂點恰好被取出一次,共執行 次。DECREASE-KEY操作:在最壞情況下,每一條邊都會觸發一次鬆弛更新,共執行 次。
因此,整體時間複雜度可表示為通用公式:
根據優先佇列的不同實現方式,時間複雜度分析如下:
-
未排序陣列(Unordered Array)實作:
EXTRACT-MIN:需線性掃描長度為 的陣列,花費 時間。DECREASE-KEY:直接存取陣列位置修改數值,花費 時間。- 總時間複雜度:
- 適用情境:密集圖(Dense Graph),當 時,陣列實作結構簡單且常數項小。
-
二元堆積(Binary Heap)實作:
- 建堆(Build-Heap):花費 時間。