111 年 國立中山大學資訊工程學系資訊安全碩士班《離散數學與演算法》
第 1 題10 分
- [10%] If R is a ring with unity and a, b are units of R, prove that ab is a unit of R and that .
登入後即可作答並保存紀錄。
核心觀念
本題屬於代數學(Abstract Algebra)中的「環論」(Ring Theory)基礎證明題,主要考查以下定義與公理:
- 具單位元的環(Ring with Unity):若環 中存在一個乘法單位元 ,使得對所有 ,皆滿足 。
- 可逆元(Unit)與乘法反元素(Multiplicative Inverse):在具單位元 的環 中,若元素 存在另一個元素 滿足 ,則稱 為環 的可逆元(Unit),且稱 為 的乘法反元素,記作 。
- 乘法結合律(Associativity of Multiplication):環 的乘法運算對任意三元素 皆滿足 。
解題方法
要證明 為環 的可逆元(Unit),必須根據定義在 中找到一個元素 ,使得 。若此元素存在,則 即為可逆元,且其反元素 。
詳細推導步驟:
-
已知條件轉化:
因為 皆為 的可逆元,故各自存在乘法反元素 ,滿足:
-
構造候選反元素並驗證右可逆性(Right Inverse):
取元素 ,計算 :
第 2 題10 分
- [10%] In how many ways can Alice place 36 different books on five shelves so that there is at least two books on each shelf? (For any of these arrangements consider the books on each shelf to be placed one next to the other, with the first book at the left of the shelf.)
登入後即可作答並保存紀錄。
先將 36 本相異書任意排列,共有 種。再於相鄰書本間的 35 個空隙中選 4 個作為五層書架的分界。
因每層至少放 2 本書,相當於正整數解
第 3 題10 分
- [10%] Let S be a set of six positive integers the maximum of which is at most 14. Prove that the sums of the elements in all the nonempty subsets of S cannot all be distinct.
登入後即可作答並保存紀錄。
核心觀念
- 鴿籠原理(Pigeonhole Principle):若將 個物件(鴿子)放入 個類別(鴿籠)中,且 ,則至少有一個類別包含 2 個或以上的物件。
- 組合計數與極值範圍:
- 設集合 的元素個數為 ,則大小為 的子集數量為組合數 。
- 子集元素和的上界由集合內可能的最大相異正整數決定。
解題方法
證明目標:證明存在兩個不同的非空子集 ,使得 。
步驟一:選定適當的子集族作為「鴿子」
設 為由 6 個相異正整數組成的集合,且最大元素小於等於 14。
考慮 中所有元素個數為 1、2 或 3 的子集:
- 大小為 1 的子集數量:
- 大小為 2 的子集數量:
- 大小為 3 的子集數量:
將這些子集作為「鴿子」,鴿子總數 為:
步驟二:估算子集元素和的範圍作為「鴿籠」
對於上述任意大小不超過 3 的子集 ,其元素和 的可能範圍計算如下:
- 最小可能和:當子集僅包含 中最小的正整數時取得,因為元素皆為正整數,故和至少為 。
- 最大可能和:當子集包含 中最大的 3 個整數時取得。
第 4 題10 分
- [10%] A company buys 22 vending machines, each of them is to be assigned to one of six sub-divisions. Each sub-division will get at least two vending machines. In how many ways can these assignments be made?
登入後即可作答並保存紀錄。
核心觀念
本題屬於離散數學中組合數學(Combinatorics)的經典題型——重複組合(Combination with Repetition / -combinations) 與 非負整數解個數問題。
- 物件與容器特性識別:
- 公司採購的 22 台自動販賣機視為相同物(Indistinguishable Objects)。
- 6 個部門(sub-divisions)為相異容器(Distinguishable Bins)。
- 重複組合公式:
將 個相同物分配給 個相異對象,允許有人沒分到(即非負整數解 ),其分配方法總數為:
- 限制條件轉換(預先分配法):
當題目規定每個對象至少需分得 個物品()時,可先將每人所需的 個物品預先扣除分配,將正整數或有限制條件的方程式轉化為標準的「非負整數解」問題。
解題方法
步驟一:建立數學方程式
設 表示第 個部門分得的自動販賣機數量(其中 )。
根據題意,總台數為 22 台,且每個部門至少分配到 2 台,可列出不定方程式與變數限制條件:
步驟二:變數變換(預先分配)
先預先給 6 個部門各分發 2 台自動販賣機,共耗去:
令變數 (代表各部門預分配後,額外獲得的販賣機數量),則 。代入原式進行變換:
步驟三:代入重複組合公式計算
求解方程式 的非負整數解個數,即為將 10 個相同的剩餘販賣機分配給 6 個相異部門的方法數 :
第 5 題10 分
- [10%] If a first case of chickenpox is recorded in a country, let pn denote the probability that a least one case is reported during the nth week after the first recorded case in case that the percentage of the population that has received at least one dose of the chickenpox vaccine achieves 85%. The country records provide evidence that , where . Since and , if the first case (of a new outbreak) is recorded on November 23, 2020, when did the probability for the occurrence of a new case decrease to less than 0.008 for the first time?
登入後即可作答並保存紀錄。
由遞迴式
及 ,得
第 6 題10 分
- [10%] In how many ways can one parenthesize the product stuvwxyz?
登入後即可作答並保存紀錄。
乘積 共有 個因子。完全括號化的方式數為第 個卡塔蘭數:
第 7 題10 分
- [10%] A wheel of fortune has the numbers from 1 to 16 painted on it in a random manner. Show whether that regardless of how the numbers are situated, there are three consecutive numbers, whose total is 23 or more, on the wheel or not.
登入後即可作答並保存紀錄。
核心觀念
本題屬於離散數學中**組合數學(Combinatorics)與鴿籠原理(Pigeonhole Principle / 平均值原理)**的典型應用。
關鍵觀念包含:
- 環狀排列與重複計數(Double Counting / Summation Trick):將 至 共 個數字排列於圓環上,每一個位置的數字恰好會被包覆在 組相鄰的三數組合中。因此,所有連續三數之和的總和,等於 至 總和的 倍。
- 廣義鴿籠原理 / 平均值原理(Generalized Pigeonhole Principle / Average Principle):若 個實數的平均值為 ,則其中必定存在至少一個數值大於或等於 (即 )。
解題方法
本題採用**鴿籠原理(或反證法)**進行嚴謹證明與推導:
步驟一:定義變數與建立模型
設 到 的任意一種環狀排列順序依序為 ,其中 為集合 的一個置換(Permutation)。
由於數字排成圓環,定義指標 modulo (即 )。
設圓盤上所有的連續三個數字之和為 :
圓盤上共有 組這樣的連續三數之和()。
步驟二:計算所有三數之和的總和
將這 組連續三數之和全部相加:
因為每一個數字 恰好會在 這三組連續三數中出現各一次,所以總和相當於 到 的總和乘以 :
計算 到 的等差級數和:
因此, 組連續三數之和的總和為:
第 8 題10 分
- (Algorithm points) [10%] Please express heapsort algorithm and analyze its time complexity in detail.
登入後即可作答並保存紀錄。
核心觀念
堆積排序(Heapsort)是一種基於比較(Comparison-based)的排序演算法,利用**最大堆積(Max-Heap)**這項資料結構來達成高效排序。
-
最大堆積(Max-Heap)之定義:
- 結構上為一棵完全二元樹(Complete Binary Tree),通常以一維陣列 儲存。對於索引為 的節點(索引從 開始):
- 父節點索引:
- 左子節點索引:
- 右子節點索引:
- 滿足最大堆積性質(Max-Heap Property):對所有非根節點 ,恆滿足 。因此,堆積的根節點 必定儲存整個堆積中的最大值。
- 結構上為一棵完全二元樹(Complete Binary Tree),通常以一維陣列 儲存。對於索引為 的節點(索引從 開始):
-
Heapsort 演算法的三大核心元件:
Max-Heapify:維護最大堆積性質。當某節點的左右子樹皆符合 Max-Heap,但該節點本身可能破壞 Max-Heap 性質時,將該節點下沈(Sift-down)至合適位置。Build-Max-Heap:將任意未排序的長度為 之陣列,由下而上(Bottom-up)轉化為 Max-Heap。Heapsort:先建立 Max-Heap,再重複將根節點(最大值)與目前堆積末端元素交換,將堆積大小減 ,並對新根節點執行Max-Heapify,直到所有元素排序完成。
解題方法
一、 Heapsort 演算法表達(Pseudocode)
1. 維護最大堆積:Max-Heapify(A, i, heap_size)
Max-Heapify(A, i, heap_size):
l = LEFT(i)
r = RIGHT(i)
largest = i
if l <= heap_size and A[l] > A[largest]:
largest = l
if r <= heap_size and A[r] > A[largest]:
largest = r
if largest != i:
swap(A[i], A[largest])
Max-Heapify(A, largest, heap_size)
2. 建構最大堆積:Build-Max-Heap(A, n)
因為葉節點(索引為 到 )本身天然滿足 Heap 性質,故只需從最後一個非葉節點 開始往回至根節點 進行 Max-Heapify。
Build-Max-Heap(A, n):
heap_size = n
for i = floor(n / 2) down to 1:
Max-Heapify(A, i, heap_size)
3. 堆積排序主程式:Heapsort(A, n)
Heapsort(A, n):
Build-Max-Heap(A, n)
heap_size = n
for i = n down to 2:
swap(A[1], A[i]) // 將最大值移至陣列末端
heap_size = heap_size - 1 // 排除已排序的末端元素
Max-Heapify(A, 1, heap_size) // 恢復根節點之 Max-Heap 性質
二、 時間複雜度詳細分析
Heapsort 的整體時間複雜度由 Build-Max-Heap 與排序主迴圈兩部分構成。
1. Max-Heapify 之時間複雜度分析
- 在高度為 的節點上執行
Max-Heapify,最壞情況下需要沿著樹枝一路下沈至葉節點。 - 每次遞迴比較與交換耗時 ,最多執行 次遞迴。
- 一棵包含 個節點的堆積,樹高為 。
- 結論:對高度為 之節點執行
Max-Heapify的時間複雜度為 ;對大小為 之堆積根節點執行Max-Heapify,時間複雜度為 。
2. Build-Max-Heap 之時間複雜度詳細推導
直觀分析可能會認為:執行 次 Max-Heapify,每次耗時 ,故總時間為 。但這是過度鬆散的上界。精確的鬆緊上界分析如下:
-
樹高與節點數量的關係:
在一棵大小為 的完全二元樹中,高度為 的節點數量最多為:
樹的最大高度為 。 -
總時間代價求和:
將所有高度的節點執行Max-Heapify的代價加總:
-
無窮級數求和推導:
第 9 題10 分
- (Algorithm points) [10%] Let T = (V, E) be a complete n-ary tree of height h with q leaves. Prove that and .
登入後即可作答並保存紀錄。
完全 叉樹中,每個內部節點至多有 個子節點。根節點位於第 層,因此第 層至多有 個節點。葉節點皆位於第 層,故
兩邊取以 為底的對數():
第 10 題10 分
- (Algorithm points) [10%] Given a knapsack with maximum capacity W and a set S consisting of n items, where each item i has weight wᵢ and benefit value bᵢ. Please describe an algorithm based on dynamic programming for packing the knapsack to achieve a maximum total benefit value of the picked items and analyze the time complexity of the algorithm. (wᵢ, bᵢ, and W are integer values.)
登入後即可作答並保存紀錄。
核心觀念
本題考查**動態規劃(Dynamic Programming, DP)**在經典演算法——**0/1 背包問題(0-1 Knapsack Problem)**上的應用與複雜度分析。
-
0/1 特性與最佳子結構(Optimal Substructure):
在 0/1 背包問題中,每個物品 (重量 、效益值 )只有「放入背包(取值 1)」或「不放入背包(取值 0)」兩種選擇,物品不可分割。當考慮前 個物品在背包容量為 下的最佳解時:- 若選擇放入第 個物品,則問題歸約為「前 個物品在容量 下的最佳解」加上 ;
- 若選擇不放入第 個物品,則歸約為「前 個物品在容量 下的最佳解」。
此性質符合最佳子結構。
-
重疊子問題(Overlapping Subproblems):
若採用單純遞迴求解,許多相同的容量與物品組合會被重複計算。動態規劃透過建立表格(DP Table)記錄已求解的子問題解答,可將時間複雜度降至偽多項式時間。
解題方法
1. 狀態定義(State Definition)
設 表示從前 個物品(物品編號 )中進行選擇,在背包總容量限制為 (其中 )時,所能獲得的最大總效益值(Maximum Total Benefit Value)。
2. 狀態轉移方程式(State Transition Equation)
考慮第 個物品(重量 ,效益值 ),其決策推導如下:
- 容量不足():無法放入第 個物品,最大效益延續前 個物品在容量 時的最佳解:
- 容量足夠():可選擇放或不放第 個物品,取效益較大者:
- 不放第 個物品:效益為
- 放入第 個物品:效益為
綜合得狀態轉移方程式:
3. 邊界條件(Base Cases)
- 當沒有物品可選時(),效益為 :
- 當背包容量為 時(),無法裝入任何物品,效益為 :
4. 演算法步驟與虛擬碼(Pseudocode)
Algorithm 01Knapsack(n, W, w, b):
Input: Number of items n, maximum capacity W, weight array w[1..n], benefit array b[1..n]
Output: Maximum total benefit value
// 1. 初始化 DP 表格
Declare DP[0..n][0..W]
for w from 0 to W do:
DP[0][w] = 0
for i from 0 to n do:
DP[i][0] = 0
// 2. 填表(由小到大求解子問題)
for i from 1 to n do:
for w from 1 to W do:
if w < w[i] then:
DP[i][w] = DP[i-1][w]
else:
DP[i][w] = max(DP[i-1][w], b[i] + DP[i-1][w - w[i]])
// 3. 回傳前 n 個物品在容量 W 下的最大效益
return DP[n][W]