112 年 國立高雄大學資訊工程學系碩士班《離散數學與資料結構》
第 1. 題
Find the number of integer solutions of the following equations:
(a) , where and for .
(b) , where and for .
登入後即可作答並保存紀錄。
核心觀念
本題考查「非負整數解」與「正整數解」的計數,主要使用隔板法(Stars and Bars)。
對方程式
而言:
- 若 ,非負整數解的個數為
- 若 ,正整數解的個數可先令
將問題轉換為非負整數解。
解題方法
(a)
題目為
其中五個變數皆為非負整數。
可將 個相同物品分配給 個變數,使用 個隔板分成 組。例如:
表示
因此需要排列 個星號與 個隔板,共 個位置,選出 個位置放隔板:
計算得
所以,(a)的整數解共有
(b)
題目為
且每個變數皆為正整數。
先令
第 2. 題
When John goes to school, he goes through a sequence of six road traffic lights, and , each has red, yellow, or green lights.
(a) In how many ways, does John have the six traffic lights on his way to school, for example, a sequence of red, red, yellow, green, yellow, and green lights?
(b) In how many ways, does John have the six traffic lights on his way to school with at least one red light, at least one yellow light, and at least one green light?
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 乘法原理:連續完成多個步驟時,總方法數為各步驟方法數的乘積。
- 補集原理與容斥原理:計算「三種顏色皆至少出現一次」的序列數。
- 每個紅綠燈的位置 均有明確區別,因此序列順序不同,即視為不同方法。
解題方法
(a)六個紅綠燈的所有可能序列
每個紅綠燈皆可顯示:
- 紅燈
- 黃燈
- 綠燈
因此每一個位置都有 種選擇,且六個位置可獨立選擇。依乘法原理:
所以共有:
(b)三種顏色皆至少出現一次
設全集 為所有六個紅綠燈的顏色序列,則:
定義:
- :沒有紅燈
- :沒有黃燈
- :沒有綠燈
題目要求的是紅、黃、綠三種顏色皆至少出現一次,也就是不屬於 的序列。因此使用容斥原理:
計算沒有某一種顏色的情形
例如沒有紅燈時,每個位置只能選黃燈或綠燈:
同理:
因此單獨扣除三種情形共:
第 3. 題
(a) What is the Pigeonhole Principle?
(b) For any , show that there exist two distinct integers such that .
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- 鴿籠原理(Pigeonhole Principle)。
- 同餘與整除的關係:
鴿籠原理指出:若將超過 個物件放入 個鴿籠,則至少有兩個物件會落在同一個鴿籠。更一般地,若有 個物件放入 個鴿籠,則某一鴿籠至少包含 個物件。
(a) 鴿籠原理的定義
若有 個物件分配到 個鴿籠中,則至少有一個鴿籠包含至少兩個物件。
在數學證明中,通常將:
- 要分配的物件視為「鴿子」;
- 可分類的位置視為「鴿籠」。
只要物件數量大於分類數量,就能保證至少有兩個物件屬於同一類。
(b) 解題方法
題目中的整數集合為
其中共有 個整數。將每個整數依照除以 的餘數分類,可能的餘數只有
共 類,因此可將這 個餘數視為 個鴿籠。
由於 中有 個整數,而餘數類別只有 類,根據鴿籠原理,必定存在兩個不同的元素 ,除以 時具有相同的餘數。也就是說,
依同餘的定義可得
第 4. 題20 分
Please propose a method, including a data structure and an algorithm, to show how to reduce the space to store the following data sequence.
ppxxxxxxpaaabapaaabff
登入後即可作答並保存紀錄。
核心觀念
本題適合使用**游程編碼(Run-Length Encoding, RLE)**壓縮資料。其核心定義是:
將連續出現的相同資料,表示成「資料值+連續次數」的形式。
例如:
原序列為:
依照連續相同字元分段:
共有 個游程。
解題方法
1. 資料結構
使用一個由記錄組成的陣列,每筆記錄包含:
symbol:字元count:該字元連續出現的次數
壓縮後的資料為:
也可寫成:
其中每個二元組代表一段連續相同的字元。
2. 編碼演算法
從左至右掃描原始序列,維護目前字元與其連續次數:
RLE(sequence):
result = empty list
i = 0
while i < length(sequence):
symbol = sequence[i]
count = 1
i = i + 1
while i < length(sequence)
and sequence[i] == symbol:
count = count + 1
i = i + 1
append (symbol, count) to result
return result
套用於本題:
- 讀到
pp,形成 。 - 讀到
xxxxxx,形成 。 - 後續依序形成 、、。
- 再處理第二組
paaab。 - 最後
ff形成 。
因此壓縮結果為:
3. 解碼方式
若要還原原始序列,對每個二元組重複輸出 symbol 共 count 次:
第 5. 題10 分
Please discuss what would happen if we apply the following assignment statement to the linked list shown below (that is, “(*a).link” is assigned to “a”).
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
此題考查單向鏈結串列中「指標重新連結」的效果。
若 a 是指向某個節點的指標,則:
*a表示a所指向的節點。(*a).link表示該節點的link欄位。(*a).link = a將該節點的link指標改為指向a所指向的節點本身。
解題方法
設 a 原本指向節點 ,且原本的鏈結關係為:
執行:
(*a).link = a;
後,節點 的 link 會被改寫成指向自己:
因此, 形成一個自我迴圈(self-loop)。
原本由 的 link 所指向的後續節點 ,不再能從 沿著 link 欄位走到。若沒有其他指標指向 或其後續節點,這些節點將失去可達性,形成記憶體遺失。
執行結果
第 6. 題10 分
Write a code segment that inserts into a circular doubly linked list the node to which B points before the node to which A points.
登入後即可作答並保存紀錄。
核心觀念與指標調整
在雙向環狀鏈結串列(Circular Doubly Linked List)中,將獨立節點 插入至節點 之前,目標是將鏈結順序調整為 。必須更新 4 個指標連結:
- 的前驅指標(
prev)指向 的前驅節點(A->prev)。 - 的後繼指標(
next)指向 。 - 原前驅節點的後繼指標指向 。
- 的前驅指標更新指向 。
精簡關鍵程式碼(C / C++)
第 7. 題30 分
The following function has two maxima — one of which is a local maximum, and the other one is the global maximum (i.e., the pair of (x, y) that yields a local or global maximum of f):
where
Please propose a data structure and corresponding algorithm to find the x and y that generate the global maximum of . (Note: the goal is to examine how you solve the problem, rather than asking for the values of x and y that yield the maximum of f. Your proposed data structure is 15%, and the algorithm is another 15%.)
登入後即可作答並保存紀錄。
核心觀念
本題考查的是「有限二維搜尋空間中的全域最佳化」,重點不是直接微分求出數值,而是設計:
- 能保存候選區域的資料結構;
- 能系統性搜尋整個定義域的演算法;
- 能區分區域極大值與全域極大值。
函數定義在封閉矩形區域
由於 是由多項式與指數函數組成的連續函數,而 是有界閉集合,因此依據魏爾斯特拉斯極值定理, 在 上必定存在全域最大值。
單純使用梯度上升法,只能保證收斂到某個局部最大值,無法保證找到全域最大值。因此本題適合使用「分支限界法」搭配最大堆積(max-heap)。
解題方法:二維分支限界法
將整個搜尋區域切割成許多小矩形。對每個矩形 維護:
- 一個目前已知的函數值下界;
- 一個該矩形內函數值的上界;
- 矩形的範圍;
- 該矩形內目前找到的最佳候選點。
若某個矩形的上界已經不可能超過目前最佳解,就可以直接捨棄該矩形,不必繼續搜尋。
1. 矩形節點的表示
令矩形
每個節點可定義為:
其中:
- :矩形 內 的安全上界;
- :矩形 內已找到的函數值下界;
- :目前的候選點,通常取矩形中心;
- :矩形本身。
以矩形中心
作為候選點,則
為了使上界正確,可使用區間算術計算 。若區間算術得到
則可令
因為所有 都滿足
2. 使用最大堆積選擇搜尋區域
使用最大堆積依照 排序,讓上界最大的矩形優先取出。
最大堆積的根節點永遠代表「最有希望產生全域最大值」的區域。每次取出該矩形後,將它分割成四個子矩形:
再分別計算各子矩形的上界與候選點,加入最大堆積。
目前最佳解以全域變數維護:
若某個矩形滿足
則即使該矩形內存在真正最大值,也只會比目前最佳值高出至多 ,因此可以安全刪除。
其中 是允許誤差,例如 。
3. 上界的計算方式
方法一:區間算術
令
則
將 、 分別以區間表示,透過區間加減乘除與指數運算,可以得到 的區間範圍。其上端即為 。
這種方法的優點是上界具有數學保證;缺點是矩形較大時,區間估計可能較寬,導致需要多切割幾次。
方法二:利用梯度建立 Lipschitz 上界
若在矩形 中可以找到梯度範數上界 ,則對任意 :
因此可令
其中 是矩形中心到最遠角落的距離:
梯度可由下式計算。令
則
以及