110 年 國立中正大學資訊工程學系碩士班甲組《軟體設計》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊
📄 以下 5 題共用同一段題幹

1.1 題幹:Will the following lines of C++ code compile?

1.2 題幹:Circle the outcome of each line of code with const int* cip.

第 1.1-(a) 題2 分

int &* a1;

Yes / No

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

C++ 的參考(reference)必須直接參照一個物件,不能被指標指向。因此,C++ 不允許「指向參考的指標」;但允許「指標的參考」,例如 int *&。

解題方法

從變數 a1 往外讀宣告符號:

int &* a1;

* 表示 a1 是指標,接著的 & 表示它指向 int 的參考,也就是「指向參考的指標」。此型別不合法,因為參考不是可供指標指向的物件。

合法的「指標的參考」寫法是:

int* p = nullptr;
int*& a1 = p;   // a1 是 p 的別名
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 1.1-(b) 題2 分

int *& a2;

Yes / No

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

int *& a2; 宣告的是「指向 int 的指標之參考」:a2 必須參考一個已存在的 int* 變數。C++ 的參考在宣告時必須立即綁定到有效物件,不能只宣告而不初始化。

解題方法

先由右向左讀型別:a2 是參考(&),參考的對象是 int*。這行宣告沒有提供任何要綁定的指標變數,因此違反參考必須初始化的規則,無法編譯。

例如,先建立指標,再讓參考綁定它:

int* p = nullptr;
int*& a2 = p;
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 1.2-(a) 題2 分

const int** b1 = &cip;

(A) Compiles
(B) Invalid syntax
(C) Violates const-ness

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查指標的型別,以及 const 限定在哪一層。已知 cip 的型別是 const int*,也就是「指向 const int 的指標」:

  • *cip 是 const int,不能透過 cip 修改整數值。
  • cip 本身不是常數指標,因此可以改指向另一個整數。

對 cip 取址後,型別會多一層指標:

cip:const int*⟹&cip:const int**\texttt{cip} : \texttt{const int*} \quad\Longrightarrow\quad \texttt{\&cip} : \texttt{const int**}

解題方法

將宣告左側與初始值的型別逐層對照:

const int* cip = nullptr;
const int** b1 = &cip;

b1 的型別是 const int**,而 &cip 的型別也是 const int**,兩者完全相同,因此可以編譯。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 1.2-(b) 題2 分

int* const * b2 = &cip;

(A) Compiles
(B) Invalid syntax
(C) Violates const-ness

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考指標的 const 修飾位置,以及多層指標之間能否隱式轉換。

const int* cip 表示 cip 是可改指向的指標,但不能透過它修改所指的 int。而 int* const* b2 表示 b2 指向一個「不可改指向的 int*」;b2 本身仍可改指向。

解題方法

先比較兩邊的型別:

  • &cip 的型別是 const int**:指向「可改指向的 const int*」。
  • b2 的型別是 int* const*:指向「不可改指向的 int*」。

兩者的內層指標型別不同:來源指向 const int,目標卻是指向 int。若允許這種轉換,就能經由 b2 把 const 限制繞過:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 1.2-(c) 題2 分

int ** const b3 = &cip;

(A) Compiles
(B) Invalid syntax
(C) Violates const-ness

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查多層指標的 const 限定,以及指標初始化時的型別相容性。

  • const int* cip:cip 是「指向唯讀 int 的指標」,指標本身可以改指向其他位置。
  • &cip 的型別是 const int**:它指向一個「指向唯讀 int 的指標」。
  • int ** const b3:b3 是「不可改指向位置的指標」,但它所指向的是一般的 int*。

因此,b3 要求的初始值型別是 int**;實際提供的 &cip 型別則是 const int**,兩者不相容。

解題方法

逐層由變數往外讀型別:

const int* cip;

cip 指向 const int,所以取址後:

&cip  // 型別為 const int**

再看宣告:

int ** const b3 = &cip;

這裡的 const 限定的是最外層的 b3:b3 本身不能改指向,但其目標型別仍是 int**。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

Consider the following C++ classes. The code below causes no compiler errors.

#include <iostream>
using namespace std;

class A {
public:
    void f1() { f2(); cout << "A::f1, "; }
    virtual void f2() { cout << "A::f2, "; }
private:
    int m_ = 333;
};

class B : public A {
public:
    void f1() { cout << "B::f1, "; }
    virtual void f3() { cout << "B::f3, "; }
private:
    int n_ = 451;
};

class C : public B {
public:
    virtual void f1() { cout << "C::f1, "; }
    void f2() { f3(); cout << "C::f2, "; }
};

第 2-(a) 題3 分

List, in order, all functions (including constructors and destructors) that are called during the execution of the following code. Make sure to use the full Class::Function names.

A* ap = new B;
delete ap;

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查建構子的呼叫順序,以及透過基底類別指標刪除衍生類別物件時,解構子是否為虛擬函式。

B 繼承自 A。程式沒有自行宣告建構子與解構子,因此編譯器會產生隱含的預設建構子與解構子。A 的解構子不是虛擬函式;A::f2() 雖然是虛擬函式,與解構子的虛擬性無關。

解題方法

執行 new B 時,先建構基底類別,再建構衍生類別,因此建構順序確定為:

  1. A::A()
  2. B::B()

接著,ap 的靜態型別是 A*,實際指向的物件型別是 B。執行 delete ap 時,基底類別 A 的解構子不是虛擬函式。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(b) 題12 分

Assume we have objects and pointers as defined in the five lines of code below. Then, for each row of the table, fill in the result on the right, which should either be the corresponding stdout output, “compiler error”, or “runtime error”.

// Line 1
B b;

// Line 2
C c;

// Line 3
A *ap1 = &c;

// Line 4
B *bp1 = &b;

// Line 5
B *bp2 = &c;
ExpressionResult
bp1->f1();(甲)
bp1->f2();(乙)
bp2->f2();(丙)
bp2->f3();(丁)
ap1->f1();(戊)
ap1->f3();(己)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考兩件事:編譯時依指標的靜態型別查找成員函式,以及執行時對虛擬函式進行動態繫結。

  • 非虛擬函式依指標的靜態型別決定呼叫哪個版本。
  • 虛擬函式若由衍生類別重新定義,則依物件的動態型別決定呼叫哪個版本。
  • 呼叫某個函式時,函式名稱必須先能透過指標的靜態型別找到;動態繫結不會讓基底類別指標取得它沒有宣告的成員。

本題中,A::f1 和 B::f1 都是非虛擬函式;C::f1 雖宣告為虛擬函式,但不會讓 A::f1 變成虛擬函式。f2 在 A 宣告為虛擬函式,C::f2 重新定義它。f3 在 B 宣告為虛擬函式,C 沒有重新定義它。

解題方法

先確認每個指標的靜態型別與所指物件的動態型別:

指標靜態型別動態型別
bp1B*B
bp2B*C
ap1A*C

接著逐項判斷:先用靜態型別確認成員函式是否可見,再判斷該函式是否為虛擬函式;若是,才依動態型別決定執行版本。

各列分析

(甲)bp1->f1();

bp1 是 B*,可找到 B::f1。它是非虛擬函式,因此呼叫 B::f1。

輸出:B::f1,

(乙)bp1->f2();

B 沒有重新定義 f2,所以可呼叫繼承自 A 的虛擬函式。物件動態型別為 B,因此執行 A::f2。

輸出:A::f2,

(丙)bp2->f2();

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 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 A, and select the smallest vertex in alphabetical order first when performing the depth-first search.

🖼️【此處有附圖,請對照原卷】

第 3.1 題2 分

What are the edges of the depth-first spanning tree?

(A) (A,B)(A,B), (B,D)(B,D), (D,E)(D,E), (A,C)(A,C), (C,F)(C,F), (C,G)(C,G)
(B) (A,B)(A,B), (A,D)(A,D), (D,E)(D,E), (A,C)(A,C), (C,F)(C,F), (F,G)(F,G)
(C) (A,B)(A,B), (B,D)(B,D), (B,E)(B,E), (A,C)(A,C), (C,F)(C,F), (C,G)(C,G)
(D) (A,B)(A,B), (A,C)(A,C), (A,D)(A,D), (D,E)(D,E), (C,F)(C,F), (C,G)(C,G)
(E) (A,B)(A,B), (B,D)(B,D), (D,E)(D,E), (A,C)(A,C), (C,F)(C,F), (F,G)(F,G)
(F) None of the above

🖼️ 本題附圖:
第 3.1 題附圖
圖看不清楚?展開原卷第 4 頁核對
原卷第 4 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的無向圖共有 9 條邊:A ⁣− ⁣BA\!-\!B、A ⁣− ⁣CA\!-\!C、A ⁣− ⁣DA\!-\!D、B ⁣− ⁣DB\!-\!D、B ⁣− ⁣EB\!-\!E、D ⁣− ⁣ED\!-\!E、C ⁣− ⁣FC\!-\!F、C ⁣− ⁣GC\!-\!G、F ⁣− ⁣GF\!-\!G。

核心觀念

深度優先搜尋(DFS)從起點出發,每次走向「尚未拜訪」的相鄰頂點;無路可走時回溯。題目規定從 A 開始、有多個未拜訪鄰點時先走字母最小的。DFS 過程中實際走過的邊構成深度優先生成樹(DFS spanning tree),其餘的邊是回邊(back edge)。

解題方法

  1. 從 A 出發,鄰點 B、C、D 中先走 B:邊 (A,B)(A,B)。
  2. B 的未拜訪鄰點 D、E,先走 D:邊 (B,D)(B,D)。
  3. D 的鄰點 A、B 已拜訪,走 E:邊 (D,E)(D,E)。
  4. E 的鄰點 B、D 都已拜訪 → 回溯到 D、B、A。
  5. A 還有未拜訪的 C:邊 (A,C)(A,C)。
  6. C 的未拜訪鄰點 F、G,先走 F:邊 (C,F)(C,F)。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3.2 題2 分

What are the depth-first numbers (dfndfn) of each vertex, in the order of A, B, C, D, E, F, G, when performing the depth-first search on the graph above?

(A) (1,2,3,4,5,6,7)(1,2,3,4,5,6,7)
(B) (1,5,2,6,7,3,4)(1,5,2,6,7,3,4)
(C) (1,2,5,3,4,6,7)(1,2,5,3,4,6,7)
(D) (1,4,5,2,3,7,6)(1,4,5,2,3,7,6)
(E) (1,3,2,7,6,5,4)(1,3,2,7,6,5,4)
(F) None of the above

🖼️ 本題附圖:
第 3.2 題附圖
圖看不清楚?展開原卷第 5 頁核對
原卷第 5 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的無向圖共有 9 條邊:A ⁣− ⁣BA\!-\!B、A ⁣− ⁣CA\!-\!C、A ⁣− ⁣DA\!-\!D、B ⁣− ⁣DB\!-\!D、B ⁣− ⁣EB\!-\!E、D ⁣− ⁣ED\!-\!E、C ⁣− ⁣FC\!-\!F、C ⁣− ⁣GC\!-\!G、F ⁣− ⁣GF\!-\!G。

核心觀念

dfn(v)(depth-first number)是 DFS 中頂點被第一次拜訪的次序編號(從 1 開始)。

解題方法

依 3.1 的 DFS(從 A 開始、字母小的優先),拜訪順序為

A→B→D→E→(回溯)→C→F→G.A\to B\to D\to E\to(\text{回溯})\to C\to F\to G .

所以

頂點ABCDEFG
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3.3 題3 分

What are the output values of the low function (i.e., low(v)low(v)) for each vertex, in the order of A, B, C, D, E, F, G, based on (3.1) and (3.2)?

(A) (1,2,1,2,2,5,5)(1,2,1,2,2,5,5)
(B) (1,1,5,1,2,5,5)(1,1,5,1,2,5,5)
(C) (1,1,5,1,1,5,5)(1,1,5,1,1,5,5)
(D) (1,1,5,1,4,6,7)(1,1,5,1,4,6,7)
(E) (1,2,5,2,2,5,5)(1,2,5,2,2,5,5)
(F) None of the above

🖼️ 本題附圖:
第 3.3 題附圖
圖看不清楚?展開原卷第 5 頁核對
原卷第 5 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的無向圖共有 9 條邊:A ⁣− ⁣BA\!-\!B、A ⁣− ⁣CA\!-\!C、A ⁣− ⁣DA\!-\!D、B ⁣− ⁣DB\!-\!D、B ⁣− ⁣EB\!-\!E、D ⁣− ⁣ED\!-\!E、C ⁣− ⁣FC\!-\!F、C ⁣− ⁣GC\!-\!G、F ⁣− ⁣GF\!-\!G。

由 3.1、3.2:DFS 樹邊為 (A,B),(B,D),(D,E),(A,C),(C,F),(F,G)(A,B),(B,D),(D,E),(A,C),(C,F),(F,G);回邊為 (A,D)(A,D)、(B,E)(B,E)、(C,G)(C,G);dfn 為 A1、B2、D3、E4、C5、F6、G7。

核心觀念

low(v)=min⁡{ dfn(v),  min⁡w 為 v 的子節點low(w),  min⁡(v,x) 為回邊dfn(x) }low(v)=\min\big\{\,dfn(v),\ \ \min_{w\text{ 為 }v\text{ 的子節點}} low(w),\ \ \min_{(v,x)\text{ 為回邊}} dfn(x)\,\big\}

也就是:從 vv 出發,沿著子孫往下走、最後最多再走一條回邊,能到達的最小 dfn。要由葉子往上算。

解題方法

  • E(無子節點):回邊 E ⁣− ⁣BE\!-\!B,dfn(B)=2dfn(B)=2 → low(E)=min⁡(4,2)=2low(E)=\min(4,2)=2。
  • D:子節點 E 的 low 為 2;回邊 D ⁣− ⁣AD\!-\!A,dfn(A)=1dfn(A)=1 → low(D)=min⁡(3,2,1)=1low(D)=\min(3,2,1)=1。
  • B:子節點 D 的 low 為 1 → low(B)=min⁡(2,1)=1low(B)=\min(2,1)=1。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3.4 題2 分

What are the articulation points in the graph?

(A) (A,C)(A,C)
(B) (B,C)(B,C)
(C) (A)(A)
(D) (A,B,C)(A,B,C)
(E) (A,E,G)(A,E,G)
(F) None of the above

🖼️ 本題附圖:
第 3.4 題附圖
圖看不清楚?展開原卷第 5 頁核對
原卷第 5 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的無向圖共有 9 條邊:A ⁣− ⁣BA\!-\!B、A ⁣− ⁣CA\!-\!C、A ⁣− ⁣DA\!-\!D、B ⁣− ⁣DB\!-\!D、B ⁣− ⁣EB\!-\!E、D ⁣− ⁣ED\!-\!E、C ⁣− ⁣FC\!-\!F、C ⁣− ⁣GC\!-\!G、F ⁣− ⁣GF\!-\!G。

由前三小題:dfn 為 A1、B2、C5、D3、E4、F6、G7;low 為 A1、B1、C5、D1、E2、F5、G5。DFS 樹:A 的子節點是 B、C;B→D→E;C→F→G。

核心觀念

用 DFS 判斷割點(articulation point):

  1. 根節點:在 DFS 樹中有兩個以上子節點時是割點。
  2. 非根節點 uu:存在某個子節點 ww 使 low(w)≥dfn(u)low(w)\ge dfn(u) 時是割點(ww 的子樹無法繞過 uu 回到 uu 的祖先)。

解題方法

  • A(根):有兩個子節點 B、C → 割點。(拿掉 A,{B,D,E} 與 {C,F,G} 分開。)
  • B:子節點 D 的 low=1<dfn(B)=2low=1<dfn(B)=2 → 不是割點。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 4 題3 分

Given the in-order traversal (A,B,G,E,D,I,J,F,H,C)(A,B,G,E,D,I,J,F,H,C) and the post-order traversal (G,E,J,I,H,F,D,C,B,A)(G,E,J,I,H,F,D,C,B,A), find the binary tree. What is the pre-order traversal sequence of this binary tree?

(A) (B,A,C,D,E,G,F,H,J,I)(B,A,C,D,E,G,F,H,J,I)
(B) (A,B,C,H,G,E,D,I,F,J)(A,B,C,H,G,E,D,I,F,J)
(C) (A,B,C,D,E,G,F,I,J,H)(A,B,C,D,E,G,F,I,J,H)
(D) (A,C,F,I,J,G,E,H,D,B)(A,C,F,I,J,G,E,H,D,B)
(E) (A,B,G,C,E,H,D,I,F,J)(A,B,G,C,E,H,D,I,F,J)
(F) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

二元樹的中序走訪順序為「左子樹、根、右子樹」,後序走訪順序為「左子樹、右子樹、根」,前序走訪順序則為「根、左子樹、右子樹」。

因此,後序序列的最後一個節點必定是整棵樹的根;在中序序列中找到根之後,其左側與右側分別是左子樹和右子樹的節點。依此規則遞迴重建,即可得到二元樹及其前序序列。

解題方法

給定的後序序列最後一個節點是 AA,所以根為 AA。在中序序列中,AA 前方沒有節點,後方所有節點都屬於右子樹:

中序:A∣(B,G,E,D,I,J,F,H,C)\text{中序:} \quad A \mid (B,G,E,D,I,J,F,H,C)

因此,AA 沒有左子樹。右子樹的後序序列最後一個節點是 BB,所以 BB 是右子樹的根。中序序列中 BB 後方仍是其右子樹,沒有左子樹。

依同樣方式繼續拆分:

  • 接著的根為 CC,其左子樹中序為 (G,E,D,I,J,F,H)(G,E,D,I,J,F,H)。
  • 左子樹的根為 DD;其中序左子樹為 (G,E)(G,E),右子樹為 (I,J,F,H)(I,J,F,H)。
  • DD 的左子樹根為 EE,而 EE 的左子節點為 GG。
  • DD 的右子樹根為 FF;其左子樹根為 II,II 的右子節點為 JJ,FF 的右子節點為 HH。

依「根、左子樹、右子樹」產生前序序列:

(A,B,C,D,E,G,F,I,J,H)(A,B,C,D,E,G,F,I,J,H)

選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 3 題共用同一段題幹

Given a weighted directed graph with negative edges, please answer the following questions.

🖼️【此處有附圖,請對照原卷】

第 5.1 題3 分

Please perform Dijkstra’s algorithm running on the graph above from vertex A. What are the vertices in the order they are selected by Dijkstra’s algorithm?

(A) (A,B,D,F,C,G,E)(A,B,D,F,C,G,E)
(B) (A,B,D,F,C,E,G)(A,B,D,F,C,E,G)
(C) (A,B,C,E,D,F,G)(A,B,C,E,D,F,G)
(D) (A,B,D,F,G,C,E)(A,B,D,F,G,C,E)
(E) (A,B,C,E,G,D,F)(A,B,C,E,G,D,F)
(F) None of the above

🖼️ 本題附圖:
第 5.1 題附圖
圖看不清楚?展開原卷第 6 頁核對
原卷第 6 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的有向邊與權重:A→B (2)A\to B\,(2)、A→C (7)A\to C\,(7)、A→E (12)A\to E\,(12)、C→B (3)C\to B\,(3)、B→D (2)B\to D\,(2)、C→D (−5)C\to D\,(-5)、C→E (2)C\to E\,(2)、D→F (2)D\to F\,(2)、F→G (4)F\to G\,(4)、E→G (−7)E\to G\,(-7)。

核心觀念

Dijkstra 演算法每一輪從「尚未確定」的頂點中選出目前距離最小者,將它標記為已確定,再用它鬆弛(relax)相鄰的尚未確定頂點。它假設邊權非負:一個頂點一旦被選出就不再更新。圖中有負邊時,結果可能不是真正的最短路徑——本題就是要觀察這個現象。

解題方法(暫定距離逐輪更新)

選出距離鬆弛後的暫定距離
A0B=2、C=7、E=12
B2D=2+2=4
D4F=4+2=6
F6G=6+4=10
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 5.2 題3 分

What is the cost of the shortest path from vertex A to each vertex, in the order of A, B, C, D, E, F, G, after performing Dijkstra’s algorithm?

(A) (0,2,7,2,9,6,2)(0,2,7,2,9,6,2)
(B) (0,2,7,2,9,4,2)(0,2,7,2,9,4,2)
(C) (0,2,7,2,9,4,8)(0,2,7,2,9,4,8)
(D) (0,2,7,2,12,6,10)(0,2,7,2,12,6,10)
(E) (0,2,7,4,9,6,2)(0,2,7,4,9,6,2)
(F) None of the above

🖼️ 本題附圖:
第 5.2 題附圖
圖看不清楚?展開原卷第 6 頁核對
原卷第 6 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的有向邊與權重:A→B (2)A\to B\,(2)、A→C (7)A\to C\,(7)、A→E (12)A\to E\,(12)、C→B (3)C\to B\,(3)、B→D (2)B\to D\,(2)、C→D (−5)C\to D\,(-5)、C→E (2)C\to E\,(2)、D→F (2)D\to F\,(2)、F→G (4)F\to G\,(4)、E→G (−7)E\to G\,(-7)。

核心觀念

Dijkstra 演算法(教科書版本,如 Horowitz《Fundamentals of Data Structures in C》)只會更新尚未確定的頂點:頂點一旦被選出,距離就固定。邊權有負值時,這個假設會失效,演算法得到的值不一定是真正的最短距離。題目問的是「執行 Dijkstra 之後」的距離。

解題方法

依 5.1 的執行過程:

選出順序ABDFCEG
確定的距離0246792

關鍵兩步:

  • C 在 D 之後才被選出。雖然經 C 到 D 的路徑 A→C→DA\to C\to D 長度 7−5=2<47-5=2<4,但 D 已確定,不再更新,所以 *D 維持 4
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 5.3 題2 分

What is the resulting shortest path from vertex A to vertex D after performing Dijkstra’s algorithm?

(A) A→B→DA\to B\to D
(B) A→C→DA\to C\to D
(C) A→E→G→DA\to E\to G\to D
(D) A→C→E→G→DA\to C\to E\to G\to D
(E) None of the above

🖼️ 本題附圖:
第 5.3 題附圖
圖看不清楚?展開原卷第 6 頁核對
原卷第 6 頁

登入後即可作答並保存紀錄。

這一題的完整詳解

讀圖

題組附圖(原卷)的有向邊與權重:A→B (2)A\to B\,(2)、A→C (7)A\to C\,(7)、A→E (12)A\to E\,(12)、C→B (3)C\to B\,(3)、B→D (2)B\to D\,(2)、C→D (−5)C\to D\,(-5)、C→E (2)C\to E\,(2)、D→F (2)D\to F\,(2)、F→G (4)F\to G\,(4)、E→G (−7)E\to G\,(-7)。

核心觀念

Dijkstra 演算法以前驅(predecessor)記錄每個頂點的最短路徑來源;頂點被選出後距離與前驅都固定。邊權有負值時,所得路徑不一定是真正的最短路徑。

解題方法

依 5.1、5.2 的執行過程:

  • 選出 A 後,B 的暫定距離為 2(前驅 A)。
  • 選出 B 後,D 的暫定距離為 2+2=42+2=4,前驅為 B。
  • 接著 D 以距離 4 被選出並固定。之後 C(7)才被選出,雖然 7+(−5)=2<47+(-5)=2<4,但 D 已確定,前驅不再改變。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 6 題5 分

Consider the following failure function and a string “acacabacacabacacac” with 18 characters. What are the values of f(0)f(0), f(3)f(3), f(5)f(5), f(10)f(10), f(13)f(13), f(17)f(17)?

f(j)={largest k<j such that p0p1…pk=pj−kpj−k+1…pj,if such a k≥0 exists,−1,otherwise.f(j)= \begin{cases} \text{largest } k<j \text{ such that } p_0p_1\ldots p_k=p_{j-k}p_{j-k+1}\ldots p_j, & \text{if such a } k\ge 0 \text{ exists},\\ -1, & \text{otherwise}. \end{cases}

(A) (−1,1,−1,4,7,3)(-1,1,-1,4,7,3)
(B) (−1,−1,0,1,2,3)(-1,-1,0,1,2,3)
(C) (−1,1,3,5,8,−1)(-1,1,3,5,8,-1)
(D) (−1,−1,−1,4,7,−1)(-1,-1,-1,4,7,-1)
(E) (−1,2,4,0,3,7)(-1,2,4,0,3,7)
(F) None of the above

登入後即可作答並保存紀錄。

這一題的完整詳解

題目字串

原卷的字串是 acacabacacabacacac,共 18 個字元(索引 0~17):

j01234567891011121314151617
pjp_jacacabacacabacacac

核心觀念

KMP 的失敗函數 f(j)f(j):p0…pjp_0\ldots p_j 中「既是前綴、又是後綴」的最長真子字串,其最後一個字元的索引 kk;不存在時為 −1-1。可遞迴計算:已知 f(j−1)=kf(j-1)=k,若 pk+1=pjp_{k+1}=p_j 則 f(j)=k+1f(j)=k+1;否則令 k←f(k)k\leftarrow f(k) 繼續比較,直到 k=−1k=-1 時再比 p0p_0。

解題方法

j01234567891011121314151617
f(j)f(j)−1−1012−10123456789103
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 7 題4 分

Use substitution method to find a tight asymptotic upper bound for this recurrence:

T(n)=T(n/4)+T(n/5)+6nT(n)=T(n/4)+T(n/5)+6n

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考「代入法」(substitution method):先猜測遞迴式的漸近界,再用數學歸納法驗證。題目要求緊確的漸近上界,因此除了證明 T(n)=O(n)T(n)=O(n),也要確認 T(n)=Ω(n)T(n)=\Omega(n),才能得到緊確界。

解題方法

遞迴式為

T(n)=T(n/4)+T(n/5)+6nT(n)=T(n/4)+T(n/5)+6n

假設 T(n)T(n) 對充分大的 nn 為非負,且小於某個固定門檻時的基本情況皆有界。由於每層遞迴子問題的規模總和是

n4+n5=9n20,\frac{n}{4}+\frac{n}{5}=\frac{9n}{20},

小於原問題規模的一半,線性項 6n6n 將主導遞迴成本。因此猜測 T(n)=O(n)T(n)=O(n),並設歸納假設為 T(m)≤cmT(m)\le cm,其中 m<nm<n。

代入遞迴式:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 8 題4 分

Use substitution method to find a tight asymptotic lower bound for this recurrence:

T(n)=4T(n/2)+n2T(n)=4T(n/2)+n^2

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考遞迴式的漸近下界,以及代換法(substitution method)的數學歸納證明。

遞迴式為

T(n)=4T(n/2)+n2T(n)=4T(n/2)+n^2

每層的遞迴子問題數量乘上子問題規模平方後,總成本與 n2n^2 同階。遞迴深度約為 log⁡2n\log_2 n,因此預期下界為 Ω(n2log⁡n)\Omega(n^2\log n)。

解題方法

假設 nn 是 2 的冪,且基底值 T(1)≥0T(1)\ge 0。以數學歸納法證明:

T(n)≥n2log⁡2nT(n)\ge n^2\log_2 n

基底情況: 當 n=1n=1 時,右側為 12log⁡21=01^2\log_2 1=0,而 T(1)≥0T(1)\ge 0,命題成立。

歸納步驟: 假設對 n/2n/2 命題成立,即

T(n/2)≥(n/2)2log⁡2(n/2)T(n/2)\ge (n/2)^2\log_2(n/2)

代入原遞迴式:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9 題3 分

Prove or disprove with a counter example that every comparison based sorting algorithm has time complexity Ω(nlg⁡n)\Omega(n\lg n).

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查比較式排序的決策樹下界。比較式排序只能透過比較元素大小來決定輸出順序;每次比較只有兩種結果,因此可用二元決策樹表示演算法的執行過程。

以下依排序演算法通常採用的定義,將「時間複雜度」解讀為最壞情況時間複雜度,並假設輸入包含 nn 個互異元素。

解題方法

要證明最壞情況至少需要 Ω(nlg⁡n)\Omega(n\lg n) 次比較,可計算決策樹必須有多少個葉節點,再由二元樹的高度推得比較次數下界。

nn 個互異元素共有 n!n! 種可能排列。演算法必須能區分這些排列,才能對每種輸入都正確排序,因此決策樹至少需要 n!n! 個葉節點。

若決策樹高度為 hh,最多只能有 2h2^h 個葉節點,所以:

2h≥n!2^h \ge n!

取以 22 為底的對數,可得:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 10 題3 分

If a dynamic programming problem satisfies the property of optimal substructure, justify if a locally optimal solution is also globally optimal. A simple yes/no answer will not get any point.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

不一定。 動態規劃的「最佳子結構」表示:原問題的最佳解,能由其子問題的最佳解組成。它保證了把子問題解到最佳有助於構造原問題的最佳解,但不保證每一步選擇眼前看起來最好的局部決策,就能得到全域最佳解。

最佳子結構常以遞迴式表示。若原問題的最佳值為 F(x)F(x),可能需比較多種決策 aa:

F(x)=min⁡a∈A(x)(c(x,a)+F(xa))F(x)=\min_{a\in A(x)}\bigl(c(x,a)+F(x_a)\bigr)

其中 A(x)A(x) 是當前可選決策,c(x,a)c(x,a) 是採取決策 aa 的成本,xax_a 是決策後的子問題。關鍵在於:動態規劃會比較所有可行決策,再選出總成本最低者;只挑當下成本最低的決策,未必能使「當前成本加後續成本」最小。

解題方法

以硬幣找零為例,硬幣面額為 1、3、41、3、4,目標金額為 66,目標是使用最少硬幣。

若採用局部策略,每次都選不超過剩餘金額的最大面額,會先選 44,剩下 22,再選兩枚 11:

6=4+1+16=4+1+1

共使用 33 枚硬幣。

但全域最佳解是:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 11 題5 分

Let G=(V,E)G=(V,E) be an acyclic directed graph with negative-weight edges. Argue if Johnson’s reweighting approach can solve a single source shortest path problem in GG faster than the Bellman-Ford algorithm. A simple yes/no answer will not get any point.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

Johnson 重加權把可能含負權重的邊改成非負權重,讓 Dijkstra 演算法可以使用。對每個頂點 vv 設一個勢能 h(v)h(v),並定義新權重:

w′(u,v)=w(u,v)+h(u)−h(v)w'(u,v)=w(u,v)+h(u)-h(v)

若 h(v)h(v) 是從新增超級源點 qq 到 vv 的最短距離,則最短路徑的三角不等式保證:

h(v)≤h(u)+w(u,v)h(v)\le h(u)+w(u,v)

所以 w′(u,v)≥0w'(u,v)\ge 0,可用 Dijkstra 求最短路徑。重加權只會讓同一起點、終點的所有路徑增加相同的量,因此不改變最短路徑;求得新圖距離後,可以還原原圖距離。

解題方法

標準 Johnson 作法:不會比 Bellman-Ford 快。 標準流程以 Bellman-Ford 計算勢能,時間為 O(VE)O(VE);再以 Dijkstra 求單一起點距離,時間約為 O((V+E)log⁡V)O((V+E)\log V)。總時間為:

O(VE+(V+E)log⁡V)O(VE+(V+E)\log V)

對單一起點問題而言,這比直接使用 Bellman-Ford 多了額外步驟,漸近時間也沒有改善。

利用 DAG 結構計算勢能:可以更快。 新增超級源點 qq,並從 qq 向每個頂點連一條權重為 00 的邊。新增後的圖仍是 DAG。先做拓樸排序,再依拓樸順序鬆弛邊,即可在 O(V+E)O(V+E) 時間內求出所有 h(v)h(v),不必用 Bellman-Ford。

接著以 w′(u,v)=w(u,v)+h(u)−h(v)w'(u,v)=w(u,v)+h(u)-h(v) 重加權。由於 hh 是最短距離,所有新權重都非負。對新圖從指定起點 ss 執行 Dijkstra;

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 12 題6 分

In the knapsack problem, given kk items whose weights wiw_i and corresponding values viv_i have the relationship w1>w2>w3>⋯>wkw_1>w_2>w_3>\cdots>w_k and v1<v2<v3<⋯<vkv_1<v_2<v_3<\cdots<v_k. If we want to develop an efficient algorithm to find the optimal solution for such a problem, determine whether the following two types of knapsack, (a) fractional knapsack, and (b) 0-1 knapsack, have the following properties:

(1) optimal substructure;
(2) greedy choice;
(3) overlapping subproblems.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題比較背包問題的三種演算法性質:

  • 最佳子結構:整體最佳解可以由較小子問題的最佳解組成。
  • 貪婪選擇性質:存在一個局部最佳選擇,使得某個最佳解一定包含這項選擇。
  • 重疊子問題:遞迴分解會反覆遇到相同子問題,可用動態規劃儲存並重用結果。

題目給定

w1>w2>⋯>wk,v1<v2<⋯<vkw_1>w_2>\cdots>w_k,\qquad v_1<v_2<\cdots<v_k

因此,對任意 i<ji<j,物品 jj 比物品 ii 重量更輕、價值更高。在標準背包設定中,假設重量與價值為正,背包容量記為 CC。

解題方法

(a)分數背包

分數背包允許取物品的一部分。其貪婪策略是依單位重量價值 vi/wiv_i/w_i 由高至低取用。

由題目的排序可得,若 i<ji<j,則

viwi<vjwj\frac{v_i}{w_i}<\frac{v_j}{w_j}

因為 vi<vjv_i<v_j 且 wi>wjw_i>w_j。所以物品 kk 的單位重量價值最高,物品 k−1k-1 次之,依此類推。依此順序裝入物品,最後一件若無法全部裝入,就取其可裝入的部分。

分數背包也有最佳子結構:先取完單位價值最高的部分後,剩餘容量上的問題仍是相同型態的分數背包問題。

(b)0-1 背包

0-1 背包每件物品只能完整取用或不取用。一般情況下,0-1 背包不一定能用貪婪法求得最佳解;但本題的排序條件使後面的物品同時更輕且更有價值。

考慮物品 kk。若 C≥wkC\ge w_k,任何不含物品 kk、但含有其他物品的可行解,都可將其中任一物品 i<ki<k 換成物品 kk。替換後重量下降、價值上升。因此,存在一個最佳解包含物品 kk。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 13 題10 分

Please correct errors in the following program. You need to explain your corrections.

#include <stdio.h>

void main()
{
    int X;
    scanf("%d", X);

    if (X&2 == 0) {
        printf("%d is an even number\n", X);
    }
    else {
        printf("%d is an odd number\n", X);
    }
}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C 語言的輸入輸出、指標與位址、運算子優先順序,以及偶數與奇數的判斷。

  • scanf 需要接收變數的位址,才能把讀入的值存進變數。整數變數 X 的位址寫成 &X。
  • 在 C 語言中,== 的優先順序高於位元 AND 運算子 &。因此,X&2 == 0 會先計算 2 == 0,而不是先計算 X & 2。
  • 判斷整數是否為偶數,可使用餘數運算:若 X mod 2=0X \bmod 2 = 0,則 XX 是偶數,否則是奇數。
  • 標準 C 的主程式應使用 int main(void),並以 return 0; 表示正常結束。

解題方法

逐行檢查程式中的型別、參數與條件式:

  1. 將 void main() 改為標準寫法 int main(void)。
  2. 將 scanf("%d", X) 改為 scanf("%d", &X),傳入 X 的位址。
  3. 原條件 X&2 == 0 因運算子優先順序,等同於 X & (2 == 0)。由於 2 == 0 為假,結果為 0,條件實際上等同於 X & 0,永遠為零。改用 (X % 2) == 0 明確判斷奇偶。
  4. 檢查 scanf 的回傳值,確保成功讀入一個整數後才進行判斷。

修正後的程式如下:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 14 題10 分

Please write a function to find a key in a BST (Binary Search Tree). Return the address of the matched node if there is a match. Otherwise, return NULL.

The data structure for a tree node contains a key and two pointers. The key is a string. You need to declare the data structure of the tree node before the function code.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

二元搜尋樹(BST)的每個節點包含一個鍵值與左右子樹指標。依照 BST 的排序性質,對任一節點:

  • 左子樹中的鍵值小於該節點的鍵值。
  • 右子樹中的鍵值大於該節點的鍵值。

本題的鍵值是字串,因此使用 C 標準函式庫的 strcmp 比較字串。若 strcmp(a, b) 小於 00,代表 aa 的字典序小於 bb;若等於 00,代表兩者相同;若大於 00,代表 aa 大於 bb。

解題方法

從根節點開始比較目標字串與目前節點的鍵值:

  1. 若目前指標為 NULL,表示搜尋到樹的空位置仍未找到,回傳 NULL。
  2. 若字串相同,回傳目前節點的位址。
  3. 若目標字串較小,依 BST 性質只需搜尋左子樹。
  4. 若目標字串較大,只需搜尋右子樹。

使用迴圈逐層搜尋,額外空間不隨樹高增加。

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 15 題5 分

Please describe the following two string functions. You need to describe their functionality as well as the data type of the parameters and the return value.

(a) strcmp() (2%)

(b) strdup() (3%)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查 C 字串函式的用途、參數與回傳型別,以及字串記憶體的比較與配置。C 字串是以 '\0' 結尾的字元序列;字串函式通常以 char * 或 const char * 傳遞字串。

解題方法

判讀每個函式時,分別確認它是否修改字串、是否配置新記憶體,以及失敗時如何回報。這能釐清回傳值的型別與呼叫端的記憶體管理責任。

(a) strcmp()

strcmp() 比較兩個以 '\0' 結尾的字串,依字典序判斷大小;它不會修改字串內容。

int strcmp(const char *s1, const char *s2);

參數 s1、s2 都是指向唯讀字串的指標,型別為 const char *;回傳值型別是 int:

  • 回傳值小於 0:s1 的字典序小於 s2。
  • 回傳值等於 0:兩字串內容相同。
  • 回傳值大於 0:s1 的字典序大於 s2。

比較會從第一個字元開始,直到遇到第一組不同的字元,或兩字串都到達結尾。標準只保證回傳值的正負與零,不保證結果恰好是 -1、0 或 1。字元的比較依其 unsigned char 值進行。

strcmp("cat", "car")  // 正值:第一個不同字元 't' 大於 'r'
strcmp("cat", "cat")  // 0
strcmp("car", "cat")  // 負值

(b) strdup()

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題