111 年 國立中正大學資訊工程學系碩士班甲組《軟體設計》
第 1 題2 分
- (2%) The maximum number of comparisons needed for the binary search of a 2,000 element array is
(a) 1,999
(b) 9
(c) 11
(d) 13
登入後即可作答並保存紀錄。
這題考驗對二元搜尋法 (Binary Search) 時間複雜度與最大比較次數的理解。
二元搜尋法是一種在有序陣列中搜尋目標值的演算法。它的基本原理是:
- 檢查陣列中間的元素。
- 如果中間元素正好是目標值,搜尋就成功了。
- 如果目標值小於中間元素,則在陣列的左半部繼續搜尋。
- 如果目標值大於中間元素,則在陣列的右半部繼續搜尋。
- 不斷重複這個過程,直到找到目標值或陣列的搜尋範圍縮小到空。
對於一個包含 個元素的有序陣列,二元搜尋法最多需要進行 次比較才能找到目標值(或確定目標值不存在)。這是因為每次比較,搜尋範圍都會縮小一半。
題目中給定的陣列大小是 。
我們需要計算 。
第 2 題2 分
- (2%) Which of the following gives the number of elements in the array int r[]?
(a) sizeof(r)
(b) sizeof(*r)
(c) sizeof(r) / sizeof(int)
(d) sizeof(*r) / sizeof(int)
登入後即可作答並保存紀錄。
核心觀念
題目考查 C 語言中陣列名稱與 sizeof 運算子的意義。
若 r 是一個真正的整數陣列:
int r[] = {10, 20, 30, 40};
則:
sizeof(r):整個陣列所占的記憶體大小sizeof(int):單一int元素所占的記憶體大小- 陣列元素個數:
因此正確形式為:
sizeof(r) / sizeof(int)
解題方法
設陣列 r 中共有 個 int 元素,且每個 int 占用 bytes,則:
又因為:
所以:
這正好得到陣列元素個數,因此選項 (c) 正確。
選項分析
(a) sizeof(r)
此運算式得到的是整個陣列的總位元組數,不是元素個數。
例如:
int r[5];
若 sizeof(int) = 4,則:
結果是 20,不是元素個數 5,因此錯誤。
(b) sizeof(*r)
陣列名稱 r 在此處可視為指向第一個元素的指標,*r 表示第一個元素,其型別為 int。
因此:
第 3 題2 分
- (2%) If bPtr is assigned b (the name of an array), then array element b[3] can alternatively be referenced with the
pointer expression
(a) *(bPtr + 3)
(b) b[ bPtr + 3 ]
(c) *b [bPtr +3]
(d) *bPtr + 3
登入後即可作答並保存紀錄。
核心觀念
本題考查 C 語言的「陣列名稱與指標運算」:
若 bPtr 指向陣列 b 的第一個元素,則有
C 語言中,陣列下標運算可改寫為指標運算:
因此:
由於 bPtr 與 b 都指向 b[0],所以:
解題方法
直接套用陣列下標與指標的等價關係:
令 ,且以 bPtr 取代指向陣列開頭的 b:
指標加法的單位是「元素」,因此 bPtr + 3 會指向第三個索引位置,也就是 b[3] 的位址;再以 * 取值,即得到 b[3]。
選項分析
(a)*(bPtr + 3)
正確。
bPtr 指向 b[0],因此:
bPtr + 3指向b[3]*(bPtr + 3)取出該位置的元素值
所以:
(b)b[ bPtr + 3 ]
錯誤。
陣列下標運算的形式是:
第 4 題2 分
- (2%) Let x be an int on a machine with four-byte ints. What effect does
x<<=1;
x>>=1;
have?
(a) There is no effect.
(b) The leftmost bit of x is set to zero.
(c) The rightmost bit of x is set to zero.
(d) The leftmost bit of x is set to one.
登入後即可作答並保存紀錄。
核心觀念
本題考察整數的位元移位運算:
x <<= 1等同於x = x << 1:所有位元向左移一格,最右側補入0,最左側溢出的位元捨棄。x >>= 1等同於x = x >> 1:所有位元向右移一格。對本題常見的 32 位元二補數模型而言,若移位後的最左位為 ,右移時最左側補入 。
四-byte int 具有 個位元,設原始位元為:
其中 是最左側位元, 是最右側位元。
解題方法
先分析左移:
原本的最左側位元 被移出並捨棄,而最右側補入 。
接著再右移一位:
因此最後結果具有兩個特徵:
- 最左側位元必為 。
- 最右側位元必為 。
換句話說,原本的 與 都不會保留;中間的位元 到 則保留下來。
選項分析
第 5 題2 分
- (2%) What value does function mystery return when called with a value of 4?
int mystery (int number) {
if (number <= 1)
return 1;
else
return number * mystery( number - 1);
}
(a) 4
(b) 6
(c) 12
(d) 24
登入後即可作答並保存紀錄。
這題考驗對遞迴函數的理解與計算。
函數 mystery 是一個遞迴函數,它根據輸入參數 number 的值來計算結果。
基本情況 (base case) 是當 number <= 1 時,函數返回 1。
遞迴步驟 (recursive step) 是當 number > 1 時,函數返回 number 乘以 mystery(number - 1) 的結果。
我們需要計算 mystery(4) 的值。
讓我們一步步展開計算:
-
呼叫
mystery(4):
number是 4,大於 1。
所以,執行遞迴步驟:return 4 * mystery(4 - 1);
即return 4 * mystery(3); -
計算
mystery(3):
number是 3,大於 1。
所以,執行遞迴步驟:return 3 * mystery(3 - 1);
即return 3 * mystery(2); -
計算
mystery(2):
number是 2,大於 1。
所以,執行遞迴步驟:return 2 * mystery(2 - 1);
即return 2 * mystery(1);
第 6 題15 分
- (15%) Please write a program using C to reverse digits of an integer. Given a signed 32-bit integer x, return x with
its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-2^31, 2^31-1], then
return 0.
Example1: x = 123, return 321
Example2: x = -123, return -321
Example3: x = 120, return 21
int reverse(int x){
登入後即可作答並保存紀錄。
核心觀念
本題考查:
-
整數除法與取餘數
- 個位數:
x % 10 - 去除個位數:
x /= 10
- 個位數:
-
十進位數字反轉
若目前已反轉結果為rev,下一個數字為digit,則: -
32 位元有號整數範圍
反轉過程若超出此範圍,必須回傳
0。
解題方法
每次取出原數字的個位數,接到反轉結果的末尾:
digit = x % 10:取出目前個位數x /= 10:刪除目前個位數rev = rev * 10 + digit:將數字加入反轉結果
以 為例:
當前 x | digit = x % 10 | rev |
|---|---|---|
| 123 | 3 | 3 |
| 12 | 2 | 32 |
| 1 | 1 | 321 |
| 0 | — | 321 |
因此結果為 。
以 為例:
取出的數字依序為 ,形成 021。整數不保留前導零,因此結果為 。
溢位判斷
不能先執行:
rev = rev * 10 + digit;
因為 rev * 10 可能已經造成 C 語言有號整數溢位。必須在運算前判斷。
正數溢位
若:
rev > INT_MAX / 10
代表乘以 後一定超過上限。
若:
rev == INT_MAX / 10
則最後一位不能大於 INT_MAX 的個位數 :
digit > 7
負數溢位
若:
rev < INT_MIN / 10
代表乘以 後一定小於下限。
若:
rev == INT_MIN / 10
則最後一位不能小於 INT_MIN 的個位數 :
digit < -8
完整判斷式為:
if (rev > INT_MAX / 10 ||
(rev == INT_MAX / 10 && digit > INT_MAX % 10))
return 0;
if (rev < INT_MIN / 10 ||
(rev == INT_MIN / 10 && digit < INT_MIN % 10))
return 0;
在一般 C 編譯環境中:
第 7 題14 分
Find the best match of each term with the descriptions by writing a letter from to in each of the blanks.
(A) constructor ____
(B) destructor ____
(C) data member ____
(D) member function ____
(E) private ____
(F) public ____
(G) recursive ____
- a function inside of a class definition
- a function that calls itself
- a special kind of member function to change a private data member
- a special kind of member function to read a private data member
- a variable inside of a class definition
- called when a variable of that class ceases existence (i.e., de-allocated)
- called when a variable of that class comes into existence (i.e., allocated)
- the parts of a class definition that any code can access
- the parts of a class definition that only code from that class can access
登入後即可作答並保存紀錄。
核心觀念
本題考查物件導向程式設計中,類別成員、存取權限,以及建構子、解構子和遞迴函式的基本定義。
- 資料成員是類別中宣告的變數。
- 成員函式是類別中定義的函式。
- 建構子在類別物件建立時呼叫;解構子在物件生命週期結束、被銷毀時呼叫。
- public 成員可由任何程式碼存取;private 成員只能由該類別內的程式碼存取。
- 遞迴函式會呼叫自己。
解題方法
先根據各描述中的關鍵詞辨認定義,再將符合的描述編號填入各術語:
| 術語 | 判斷依據 | 對應編號 |
|---|---|---|
| constructor(建構子) | 物件建立時呼叫 | 6 |
| destructor(解構子) | 物件結束存在時呼叫 | 5 |
| data member(資料成員) | 類別中的變數 | 4 |
| member function(成員函式) | 類別中的函式 | 0 |
| private(私有) | 只有該類別內的程式碼可存取 | 8 |
| public(公有) | 任何程式碼都可存取 | 7 |
| recursive(遞迴) | 函式呼叫自己 | 1 |
第 9 題1 分
(Select one answer.) C++ templates allow:
(A) The same generic code to operate on different variables/arguments
(B) The same generic code to operate on different types of data
(C) Code skeletons to be easily distributed
(D) Users to re-write their code for different implementation options
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
C++ 範本(template)讓程式設計者撰寫可參數化的通用程式碼,再依不同的資料型別產生對應的函式或類別。例如,同一個函式範本可以用於整數或浮點數,而不必各寫一份幾乎相同的函式。
解題方法
依原卷圖,第 9 題問的是 C++ templates 的用途,選項 A 至 E 分別談到不同變數/引數、不同資料型別、散布程式碼骨架、改寫程式碼,以及以上皆非。判斷關鍵是看範本參數化的是什麼;C++ 範本主要用來讓同一份通用程式碼適用於不同資料型別。
選項分析
第 10 題3 分
Suppose that an AVL tree is implemented/represented as an array, and we insert the following numbers one by one to construct an AVL tree:
What does the array that represents the AVL tree look like?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
已讀取兩張原卷頁圖。由 原卷頁圖(第 3 頁)確認第 10 題的完整內容:
- 插入順序:
- 選項:
- (a)
- (b)
- (c)
- (d)
- (e) None of the above
核心觀念
本題考兩個觀念的結合:
- AVL 樹(平衡二元搜尋樹):每次插入後,若任一節點的左右子樹高度差超過 1,就必須透過旋轉(LL、RR、LR、RL)使樹重新平衡。
- 二元樹的陣列表示法(array representation):根節點存於 index 0(或 1),對於 index 的節點,其左子節點在 、右子節點在 (若以 0 為起始)。按 level-order(層序) 的順序將節點依序填入陣列。
解題方法
依插入順序逐一建構 AVL 樹,遇到不平衡時執行對應旋轉,最後將最終的 AVL 樹以 level-order 寫成陣列。
逐步插入與旋轉
插入 51:
51
插入 26:
51
/
26
平衡因子皆 ≤ 1,無需旋轉。
插入 11:
51 ← BF = 2(不平衡)
/
26
/
11
節點 51 的左子樹高度 2、右子樹高度 0,BF = 2。這是 LL 型,對 51 做右旋轉:
26
/ \
11 51
插入 6:
26
/ \
11 51
/
6
平衡,無需旋轉。
插入 8:
26
/ \
11 51
/
6
\
8
節點 11 的 BF = 2(左子樹高度 2、右子樹高度 0),且失衡路徑為「左子 6 → 右子 8」,屬 LR 型。先對 6 左旋、再對 11 右旋:
- 左旋 6:
11
/
8
/
6
- 右旋 11:
26
/ \
8 51
/ \
6 11
插入 4:
26
/ \
8 51
/ \
6 11
/
4
檢查各節點平衡因子:節點 8 的 BF = 2 − 1 = 1,節點 26 的 BF = 3 − 1 = 2(不平衡)。節點 26 是 LL 型(沿左-左方向失衡),對 26 做右旋轉:
8
/ \
6 26
/ / \
4 11 51
插入 7:
第 11 題3 分
There exists a binary tree, each of whose nodes contains a letter. In a post-order traversal, the sequence of the output is .
Suppose that the number of children of the nodes is listed here:
🖼️【此處有附圖,請對照原卷】
Is the tree unique? What is the order of the nodes in a pre-order traversal of the binary tree?
(A) No,
(B) Yes,
(C) No,
(D) Yes,
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
二元樹的後序走訪順序為「左子樹、右子樹、根節點」,前序走訪順序為「根節點、左子樹、右子樹」。若節點只有一個子節點,題目未指定它是左子節點或右子節點,因此可能有不同的二元樹;但這個位置差異不會改變該節點的前序或後序輸出。
解題方法
依原卷可讀到後序序列為 ;表格列出的子節點數依序是 。
後序序列最後一個節點 是根。往前依各節點的子節點數分組: 是葉節點, 有一個子節點 , 有一個子節點 ;接著 是葉節點, 有一個子節點 。 的兩個子樹依序為 與 ,而 的兩個子樹依序為 與 。
因此,前序走訪依序是先訪問 ,再走訪 子樹,最後走訪 子樹:
這棵樹不唯一: 都只有一個子節點,各自可將唯一的子節點放在左側或右側,形成不同的二元樹。不過,單一子節點的左右位置不會改變前序輸出。
第 12 題3 分
Given an unsorted array containing the following numbers. You should construct a binary tree from the array and convert it into a max-heap.
What does the array look like after the second phase (continuously output the first two largest numbers) of performing a heap sorting?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
最大堆(max-heap)是一種完全二元樹,每個節點的值都大於或等於其子節點。以陣列表示時,索引 的左右子節點分別位於 與 。
堆積排序先建立最大堆,再連續取出堆頂的最大值。取出堆頂後,將目前堆的最後一個元素移到根節點,並向下調整,使剩餘元素仍符合最大堆性質。
解題方法
圖中原始陣列為 ;題目要求輸出前兩個最大值後,列出剩下的陣列。以下採用堆積排序常見的自底向上建堆法。
從最後一個非葉節點開始向上調整,初始最大堆為:
第一次取出堆頂 ,將最後一個元素 移至根節點並向下調整,得到:
第二次取出堆頂 ,將目前堆尾的 移至根節點並向下調整,得到:
因此,取出的前兩大值依序為 、,剩餘陣列為 。
第 13 題2 分
The following values are to be stored in a hash table. Use the division method of hashing with a table size of (index starting at ) and use the linear probing method of resolving collisions.
What does the table look like?
(A)
🖼️【此處有附圖,請對照原卷】
(B)
🖼️【此處有附圖,請對照原卷】
(C)
🖼️【此處有附圖,請對照原卷】
(D)
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
除法雜湊法以鍵值除以表格大小的餘數作為初始位置:
若該位置已被占用,線性探測就依序檢查下一格,直到找到空格;探測到表尾時會回到索引 。
解題方法
原卷列出的插入值依序為 ,表格大小為 。依序計算餘數,遇到碰撞便向後探測:
- :放入索引 。
- :放入索引 。
- :放入索引 。
- :放入索引 。
- :索引 已有 ,放入索引 。
- :索引 、 已占用,放入索引 。
- :索引 已占用,往後回到索引 ,放入索引 。
- :索引 、 已占用,放入索引 。
因此索引 至 的表格為:
第 14 題3 分
The following is a list representation for a tree. The format of in the representation represents that is a parent node with two children nodes and .
🖼️【此處有附圖,請對照原卷】
Please draw this tree and convert it into a binary tree. What is the order of the nodes in a post-order traversal of the binary tree?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
本題考查一般樹轉換為二元樹,以及二元樹的後序走訪。
一般樹常用「左子女-右兄弟」表示法轉成二元樹:
- 左指標指向該節點的第一個子女。
- 右指標指向該節點的下一個兄弟。
- 二元樹後序走訪依序為「左子樹、右子樹、根節點」。
因此,轉換後的二元樹後序走訪不一定等同一般樹的後序走訪。
解題方法
原卷圖中的樹結構與題目表示式一致: 的子女為 ; 的子女為 ; 的子女為 ; 的子女為 ; 的子女為 ;而 的子女為 。
原樹可畫成:
A
├─ B
│ ├─ E
│ │ ├─ K
│ │ └─ L
│ └─ F
├─ C
│ └─ G
└─ D
├─ H
│ └─ M
├─ I
└─ J
依「左子女-右兄弟」表示法,轉換後各節點的左、右子節點如下:
| 節點 | 左子節點(第一個子女) | 右子節點(下一個兄弟) |
|---|---|---|
| A | B | 無 |
| B | E | C |
| C | G | D |
| D | H | 無 |
| E | K | F |
| F | 無 | 無 |
| G | 無 | 無 |
| H | M | I |
| I | 無 | J |
| J | 無 | 無 |
| K | 無 | L |
| L | 無 | 無 |
| M | 無 | 無 |
接著依二元樹後序規則逐段走訪:
第 15 題3 分
What is the prefix form of the following expression?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
前序式(prefix form)把每個運算子放在其運算元之前。例如 寫成 。轉換時先依括號與運算子優先順序建立運算結構,再依序輸出「運算子、左運算元、右運算元」。
乘法與除法優先於加法與減法;同一優先級的運算由左至右計算。因此, 會解析為 ,而 會解析為 。
解題方法
依原卷圖,題目表達式為
加減同級且由左至右,因此整體結構是
逐部分轉成前序式:
- :
- :
- :
- :
- :
- :
- :
第 18 題4 分
Argue whether the following algorithms are asymptotically optimal or not. Write down your reasoning.
(a) Quicksort
(b) Mergesort
登入後即可作答並保存紀錄。
核心觀念
本題考查排序演算法的漸近時間複雜度,以及比較式排序的下界。對 個互異鍵值進行比較式排序,必須能分辨 種可能的輸入排列。以決策樹表示比較過程時,樹至少需要 個葉節點,因此最壞情況比較次數至少為
因此,若某比較式排序演算法在最壞情況下達到 ,便是漸近最優。
解題方法
分別檢查快速排序與合併排序的最壞情況複雜度,再和比較式排序的 下界比較。快速排序的結果須區分最壞情況與平均情況,因為分割是否平衡會影響遞迴深度。
選項分析
(a) Quicksort
每次分割需 時間。
-
最壞情況: 若每次選到的樞紐都是最大值或最小值,分割大小為 與 ,遞迴式為
累加後得到 。這高於比較式排序的 最優界,因此快速排序在最壞情況下不是漸近最優。
第 19 題17 分
🖼️【此處有附圖,請對照原卷】
(a) (2%) Argue what the output will be if we specify a source node and input the graph at left into the Dijkstra algorithm. Write down your reasoning.
(b) (4%) Reweight the graph at left.
(c) (8%) Apply Floyd-Warshall algorithm to the left graph and derive the distance and predecessor matrices. Write down your derivation.
(d) (3%) Given another graph , how do you tell which of Floyd-Warshall algorithm and Johnson's algorithm is theoretically faster to solve the shortest path problem?
登入後即可作答並保存紀錄。
核心觀念
本題考查 Dijkstra 演算法的適用條件、Johnson 重加權,以及 Floyd–Warshall 演算法的全點對最短路徑計算。Dijkstra 要求邊權非負;Johnson 透過頂點勢能重加權,把沒有負權環的圖轉成非負權圖;Floyd–Warshall 則逐一允許頂點作為中繼點,更新所有點對的距離。
解題方法
依原圖讀得頂點順序為 ,有向邊為 權重 、 權重 、 權重 、 權重 、 權重 ,以及斜邊 權重 。以下 (a) 以 為起點;(b) 使用 Johnson 重加權;(c) 的前驅矩陣以「第 列、第 欄記錄從 到 最短路徑上,緊鄰 的前一個頂點」為定義。
(a) Dijkstra 的輸出
Dijkstra 的正確性保證要求所有邊權非負;本圖有負權邊 、,因此一般情況下不能保證 Dijkstra 算出正確的最短路徑。
若指定 為起點,標準 Dijkstra 依序選取:
- 選 ,得到 。
- 選 ,經 得到 。
- 選 ,經 得到候選距離 ,與目前的 相同。
- 選 。負權邊 、 會產生候選值 、,但 已被確定。
所以標準 Dijkstra 的輸出距離為
這次結果恰好是正確的最短距離,但只是此起點與此圖上的巧合;負權邊仍使 Dijkstra 不具備一般正確性保證。
(b) 重加權圖
Johnson 演算法先加入超級起點 ,並令 到每個頂點的邊權皆為 。以 Bellman–Ford 求得勢能:
例如, 權重 ,所以可得 ;再由 、 得 、。對每條邊套用
逐邊計算:
| 原邊 | 重加權計算 | 新權重 |
|---|---|---|
重加權後所有邊權皆非負,因此可對重加權圖執行 Dijkstra。驗算可見每條新邊權都不小於 ,而原圖中任一點對的路徑長度與重加權後的路徑長度只差端點勢能,故最短路徑不變。
(c) Floyd–Warshall 距離與前驅矩陣
初始化時,對角線距離設為 ,直接邊填入其權重,其餘距離為 :
令 表示只允許前 個頂點作為中繼點時,從 到 的最短距離。使用遞迴式
第 20 題4 分
Derive the optimal ternary Huffman code for the following symbols with probabilities.
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
三元 Huffman 編碼是以前綴碼表示符號,並讓平均碼長最小的方法。每一步選取機率最小的三個節點合併成一個父節點,其權重為三者機率之和;重複合併直到只剩根節點。樹枝標記為 ,從根到葉節點的路徑即為該符號的碼字。
三元 Huffman 樹若每個內部節點都有三個子節點,葉節點數須符合 。本題有 個符號,符合條件,不需補入虛擬符號。
解題方法
原卷表格列出七個符號及機率: 的機率依序為 。依機率由小到大,先合併最小的三個節點:
這個父節點代表 。接著在剩餘節點中,合併機率最小的三個:
這個父節點代表 。最後剩下 、權重 的父節點,以及權重 的父節點,將三者連到根節點。
依序為根節點的三個子節點及各群組內的子節點標上 ,可得到一組最適碼:
(4%) To find the articulation points in the graph below, start with constructing a depth-first spanning tree by doing a depth-first search of the graph.
Instead of choosing an arbitrary vertex to start, your first vertex must be set to vertex , and select the smallest vertex in alphabetical order first when performing the depth-first search. The depth-first number starts at .
🖼️【此處有附圖,請對照原卷】
第 16-(1) 題1 分
What are the edges of the depth-first spanning tree?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
深度優先搜尋(DFS)從指定起點出發,每次依字母順序走訪尚未拜訪的相鄰頂點。第一次沿著某條邊抵達新頂點時,該邊就是 DFS 生成樹的樹邊;若邊連接的頂點已拜訪,該邊不列入生成樹。
解題方法
圖中的頂點為 至 ;由圖可讀出無向邊:。從 開始,並在每個頂點依字母順序選擇尚未拜訪的鄰點。
- 從 出發,先走到字母最小的鄰點 ,加入樹邊 。
- 在 ,未拜訪鄰點中先走到 ,加入 。 的鄰點皆已拜訪,回溯至 。
- 尚未拜訪的鄰點依序為 ,先走到 ,加入 。
- 在 ,依字母順序先走到 ,加入 。
- 在 ,走到尚未拜訪的 ,加入 。
- 在 ,依序走到 ,加入 ;再從 走到 ,加入 。
第 16-(2) 題2 分
What are the output values of the low function (i.e., ) for each vertex (in the order of )?
(A)
(B)
(C)
(D)
(E)
(F) None of the above
登入後即可作答並保存紀錄。
核心觀念
本題考深度優先搜尋(DFS)中的 。令 為頂點 首次被拜訪的編號; 是從 出發,沿 DFS 樹向下,再至多經一條非樹邊,所能到達的最小 DFS 編號。計算時取以下數值的最小值: 自己的編號、通往已拜訪祖先的非樹邊所到達的編號,以及 DFS 子節點的 值。
解題方法
圖中的邊為 、、、、、、、、、、。依題意從 開始,鄰點按字母順序優先拜訪。
DFS 先走 ,回到 後走 。因此 DFS 編號為:
DFS 樹邊為 、、、、、、。非樹邊 讓 能回到編號 的祖先; 讓 能回到編號 的祖先; 讓 能回到編號 的祖先。
由葉節點往上計算:
- 經非樹邊 到達編號 ,所以 ; 的子節點 也使 。
- 是 DFS 根,編號為 ,所以 。
- 經非樹邊 回到編號 ,故 ; 的子節點 使 。
第 16-(3) 題1 分
What are the articulation points in the graph?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
(4%) Given the below directed graph, please answer the following questions.
🖼️【此處有附圖,請對照原卷】
第 17-(1) 題2 分
In the directed graph, each node represents an event, and each edge represents an activity with the time required to perform the activity. What is the critical path?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
此題考「活動箭線圖」的要徑。每條有向邊代表一項活動,邊上的數字是所需時間;要徑是從起點到終點的總工期最長路徑。可由起點逐點計算最早事件時間:
解題方法
圖中的活動與時間為::5、:6、:3、:6、:3、:3、:4、:5、:1、:4、:5、:2、:4、:2。
依照箭線方向逐點計算最早事件時間:
- ,所以 、。
- 。
- ;。
- ;。
- 。
第 17-(2) 題2 分
Please perform Dijkstra's algorithm running on the graph above. Use the cost on each edge as the weight and find the shortest path from vertex to all vertices.
What are the vertices in the order they are selected by Dijkstra's algorithm?
(A)
(B)
(C)
(D)
(E) None of the above
登入後即可作答並保存紀錄。
核心觀念
Dijkstra 演算法用來求非負權重圖中,起點到各頂點的最短距離。每一步從尚未選取的頂點中,挑選目前暫定距離最小者定案,再用它更新相鄰頂點的距離。
解題方法
圖中的有向邊與權重為: 權重 、 權重 ; 權重 ; 權重 、 權重 ; 權重 、 權重 、 權重 ; 權重 、 權重 ; 權重 ; 權重 ; 權重 ; 權重 。
從頂點 開始,依序選取目前暫定距離最小的頂點:
| 選取頂點 | 起點至該點的暫定最短距離 | 更新重點 |
|---|---|---|
| 經 到 ,得 | ||
| 經 到 ,得 ;到 的距離為 ,不更新 | ||
| 到 得 ,不更新; | ||
| 更新 | ||
| 更新 | ||
| 更新 |
(10%) For each of the two data types below, and each of the five properties listed, select the correct answer (True or False).
Data types:
- a dynamically allocated character array ()
- a string object
Properties:
- Able to contain null characters inside of it.
- Memory is automatically de-allocated.
- Characters inside of the string can be changed if desired.
- For any , can access the th character inside of the string in constant time.
- The operator (assignment) makes a deep copy.
🖼️【此處有附圖,請對照原卷】
第 8-(A) 題
A. For a dynamically allocated character array (), select the correct answer for property 1.
(A) True
(B) False
登入後即可作答並保存紀錄。
核心觀念
本題考查動態配置的字元陣列與 C 風格字串的差別。char* 是指向字元陣列的指標;陣列中的 '\0' 是一個可儲存的字元。以空字元結尾的字串操作通常會在第一個 '\0' 停止,但這不代表陣列不能在中間存放空字元。
解題方法
原卷列出的資料型態是「動態配置的字元陣列(char*)」,第 1 項問它能否在內部包含空字元。判斷時要看陣列實際可儲存的內容,而不是把它直接視為只以第一個空字元為界的 C 風格字串。
第 8-(F) 題
F. For a string object, select the correct answer for property 1.
(A) True
(B) False
登入後即可作答並保存紀錄。
核心觀念
本題考查 C++ 字串物件能否在字串內容中保存空字元 '\0'。std::string 會記錄字串長度,因此可以把 '\0' 當作內容中的字元保存;它不會像以空字元結尾的 C 字串那樣,在第一個 '\0' 處就判定字串結束。
解題方法
依原卷圖,第 8 題比較「動態配置的字元陣列(char*)」與「字串物件」的五項性質;第 1 項問能否在字串內含有空字元。本小題指定字串物件,因此判斷重點是它能否保存內含 '\0' 的內容。