110 年 國立政治大學資訊科學系碩士班《資料結構與演算法》

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

(10%) Prove or disprove the following statements(nn is the size of the input array):

第 1-a 題5 分

a. (5%) The time complexity of any sorting algorithm is O(n2)O(n^2).

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

這一題的完整詳解

核心觀念

  • 時間複雜度 (Time Complexity):描述演算法隨著輸入規模增長,其執行時間的漸近上界。常用的大 O 表示法只關心最壞情況的上界。
  • 排序演算法的下界:在比較模型 (comparison‑based model) 中,任意能正確排序的比較排序必須至少比較 Ω(nlog⁡n)\Omega(n\log n) 次(資訊理論下界)。
  • 非比較排序:對特定資料型別(例如整數、字元)可利用基數排序、計數排序或桶排序等,這些演算法的時間複雜度可達 O(n)O(n),但它們依賴於資料的鍵值範圍或位元長度,而非純粹的比較操作。

解題方法

  1. 判斷敘述的範圍:題目未限定「比較排序」或「任意排序」的類型。
  2. 若以比較模型為前提:
    • 根據比較排序的資訊理論下界,任何正確的比較排序在最壞情況下必須執行至少 Ω(nlog⁡n)\Omega(n\log n) 次比較。
    • 因此其時間複雜度的下界是 Ω(nlog⁡n)\Omega(n\log n),而 O(n2)O(n^2) 只是一個較寬鬆的上界。雖然 O(n2)O(n^2) 仍然「成立」於所有比較排序(因為 nlog⁡n∈O(n2)n\log n \in O(n^2)),但此敘述無法提供嚴格的界限,且在嚴格的「等價」意義上是不正確的。
  3. 若允許非比較排序:
    • 計數排序、基數排序、桶排序在合適的輸入限制下可達 O(n)O(n)。這些演算法的時間複雜度明顯低於 O(n2)O(n^2)。
    • 因此,存在排序演算法的時間複雜度 不 為 O(n2)O(n^2)(例如 O(n)O(n)),敘述必然為 假。
🔒

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

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

免費註冊

第 1-b 題5 分

b. (5%) The best-case time complexity of insertion sort is θ(nlog⁡n)\theta(n\log n).

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

這一題的完整詳解

核心觀念

  • Insertion Sort:對於長度為 nn 的輸入陣列 A[1..n]A[1..n],外層迴圈從第 22 個元素開始,將其插入已排序好的前 i−1i-1 個元素之中。
  • 時間複雜度的定義:
    • 最佳情況 (best‑case) 指所有可能的輸入中,使演算法執行時間最小的那一類輸入。
    • Θ\Theta 表示上下界相同的漸進量級,即存在常數 c1,c2>0c_1,c_2>0 使 c1f(n)≤T(n)≤c2f(n)c_1f(n)\le T(n)\le c_2f(n) 成立於充分大的 nn。

解題方法

  1. 分析最佳情況的輸入
    • 當陣列已經 完全排序(遞增)時,插入排序的內層 while 迴圈在每一次外層迭代只檢查一次 A[j]≤A[j+1]A[j] \le A[j+1] 即可停止。
  2. 計算比較與搬移次數
    • 第 ii 次外層迭代(i=2,…,ni=2,\dots,n)只做 一次比較,且不需要搬移元素。
    • 總比較次數 Cbest=∑i=2n1=n−1=Θ(n)C_{\text{best}} = \sum_{i=2}^{n} 1 = n-1 = \Theta(n)。
    • 總搬移次數 Mbest=0M_{\text{best}} = 0(已排序陣列不需要搬移)。
  3. 求得時間複雜度
🔒

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

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

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

(10%) Assume P≠NPP \ne NP. For each of the following statements, answer True or False. No explanation is needed.

第 2-a 題5 分

a. (5%) If a problem is in NP-hard, then the problem is in NP.

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

這一題的完整詳解

核心觀念

  • NP:可在多項式時間內由非確定式圖靈機驗證的問題集合。
  • NP‑hard:對所有 L∈NPL\in\text{NP},都有 L≤pHL\le_{p} H(多項式時間可還原),即 HH 至少和 NP 中最難的問題一樣難。
  • NP‑complete:同時屬於 NP 與 NP‑hard。

解題方法
判斷敘述的正確性,只需檢視「NP‑hard 是否必然落在 NP」的定義關係。

  • 若「NP‑hard ⊆ NP」成立,則所有 NP‑hard 問題皆為 NP,等價於「所有 NP‑hard 問題皆為可在多項式時間驗證」;
  • 事實上,NP‑hard 包含許多已知不屬於 NP 的問題(例如 HALTING、TQBF、最優化問題的近似版本),只要找出一個反例即可斷定敘述為 False。
🔒

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

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

免費註冊

第 2-b 題5 分

b. (5%) If a problem is in NP, then the problem is in NP-complete.

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

這一題的完整詳解

核心觀念

  • NP(Non‑deterministic Polynomial time):一類決策問題,若答案為 YES,存在多項式長度的驗證證明,使得在多項式時間內可以驗證。
  • NP‑Complete:屬於 NP,且所有 NP 問題皆可在多項式時間內「多項式歸約」到此問題。換言之,NP‑Complete 是 NP 中「最難」的一群問題。
  • P ≠ NP(題目假設):表示至少存在至少一個屬於 NP 而不屬於 P 的問題。

解題方法

  1. 判斷敘述的邏輯結構:

「若 x∈NP,則 x∈NP‑Complete」\text{「若 }x\in \text{NP,則 }x\in \text{NP‑Complete」}

這是充分條件的說法,等價於「NP ⊆ NP‑Complete」。
2. 依據定義,NP‑Complete ⊆ NP(即每個 NP‑Complete 必然屬於 NP),但反向包含 不成立,因為 NP 中還包含許多「較易」的問題(如 SAT 的子問題、圖的連通性、最短路徑決策問題等)。
3. 用反例直接證偽:只要找出一個屬於 NP 但不是 NP‑Complete 的問題,即可證明敘述為假。

🔒

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

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

免費註冊

第 3 題15 分

(15%) Use an example to explain why Dijkstra's shortest path algorithm cannot be applied to graphs with negative edge weights. In your example graph, please highlight the source and the destination.

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

這一題的完整詳解

核心觀念

  1. Dijkstra 演算法的本質(Greedy Approach):
    Dijkstra 演算法是一種貪婪演算法(Greedy Algorithm)。其演算法的核心不變性(Invariant)建立在**邊權重皆為非負(Non-negative Edge Weights)**的假設上:
    • 當一個頂點 uu 被從未拜訪集合(Unvisited Set)中挑選出並標記為「已確定最短路徑」(Visited / Finalized)時,演算法假設:往後透過其他未走訪的頂點,其累加路徑長度只會增加或維持不變,不可能透過後續路徑使得到達 uu 的距離變得更短。
    • 每個節點一旦出隊(Pop / Finalize)並完成鬆弛(Relaxation),便不再被更新。
  2. 負權重邊(Negative Edge Weights)破壞貪婪選擇性:
    若圖中存在負權重邊(即使沒有負權重環 Negative Cycle),一條「節點數較多或看似總權重較大的路徑」,可能會因為中途或後段包含大幅度的負權重邊,導致其真實路徑總長反而小於已提早被標記為 Finalized 的路徑。由於經典 Dijkstra 演算法不會重新走訪已確定節點,因而會計算出錯誤的最短路徑。

解題方法

題目要求建構一個包含**起點(Source)與終點(Destination)**的反例圖(Counterexample Graph),並逐步展示 Dijkstra 演算法在此圖上為何會失敗。

1. 反例圖建構

給定有向圖 G=(V,E)G = (V, E),其中頂點集合 V={S,A,B}V = \{S, A, B\}:

  • 起點(Source):SS
  • 終點(Destination):BB
  • 中間節點:AA

邊與權重集合 EE 定義如下:

  1. (S,B)(S, B),權重為 55
  2. (S,A)(S, A),權重為 22
  3. (A,B)(A, B),權重為 −4-4
       [ 2 ]           ( -4 )
 (S) ---------> (A) ------------> [B]
  |                                ^
  |             [ 5 ]              |
  +--------------------------------+

* 起點 (Source)       : S
* 終點 (Destination)  : B

2. Dijkstra 演算法執行過程

設 d[v]d[v] 表示從起點 SS 到頂點 vv 的最短估計距離,SvisitedS_{visited} 為已確定(Finalized)的頂點集合。

  • 初始化(Initialization):
    d[S]=0,d[A]=∞,d[B]=∞d[S] = 0,\quad d[A] = \infty,\quad d[B] = \infty
    Svisited=∅S_{visited} = \emptyset

  • 第 1 步(訪問起點 SS):

    • 從未造訪集合中挑選 dd 值最小的頂點:選取 SS(因為 d[S]=0d[S] = 0)。
    • 將 SS 加入已確定集合:Svisited={S}S_{visited} = \{S\}。
    • 對 SS 的外向邊進行鬆弛(Relaxation):
      • 鬆弛邊 (S,A)(S, A):d[A]=min⁡(∞,d[S]+2)=2d[A] = \min(\infty, d[S] + 2) = 2
      • 鬆弛邊 (S,B)(S, B):d[B]=min⁡(∞,d[S]+5)=5d[B] = \min(\infty, d[S] + 5) = 5
  • 第 2 步(貪婪選擇 AA):

    • 未造訪節點為 {A,B}\{A, B\},目前 d[A]=2d[A] = 2、d[B]=5d[B] = 5。
    • 挑選最小者:選取 AA。
    • 將 AA 加入已確定集合:Svisited={S,A}S_{visited} = \{S, A\}。
    • 對 AA 的外向邊進行鬆弛:
🔒

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

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

免費註冊

第 4 題10 分

(10%) Give two advantages of red black trees over hash tables.

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

這一題的完整詳解

核心觀念
紅黑樹 (Red‑Black Tree) 與雜湊表 (Hash Table) 均屬於動態資料結構,用於維持資料的插入、刪除與搜尋。

  • 紅黑樹是一種自平衡二元搜尋樹,保證在最壞情況下的高度為 2log⁡2(n+1)2\log_2 (n+1),因此所有基本操作的時間複雜度皆為 O(log⁡n)O(\log n)。
  • 雜湊表透過雜湊函式將鍵映射至陣列索引,平均情況下操作為 O(1)O(1),但最壞情況下可能退化為 O(n)O(n)(全部碰撞於同一桶)且需要重新雜湊 (rehashing) 來維持負載因子。

解題方法
題目要求列舉兩項紅黑樹相較於雜湊表的優勢。

  1. 有序性 (Ordered Traversal)

    • 紅黑樹保留鍵值的全序關係,任意時間皆可透過中序走訪得到遞增序列,或在 O(log⁡n)O(\log n) 時間內執行範圍查詢 (range query)。
    • 雜湊表的鍵值分佈是隨機的,無法直接支援有序走訪或範圍查詢,若需此功能必須額外維護排序結構或將鍵先收集再排序,導致額外 O(nlog⁡n)O(n\log n) 開銷。
  2. 最壞情況保證 (Worst‑case Guarantees)

    • 紅黑樹的自平衡性保證 所有操作的時間上界都是 O(log⁡n)O(\log n),且此上界在任何資料分佈下都成立。
    • 雜湊表在雜湊函式不佳、負載因子過高或大量碰撞時,最壞情況會退化為線性搜尋 O(n)O(n),且重新雜湊的時間成本不可忽視。
🔒

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

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

免費註冊

第 5 題15 分

(15%) An independent set II of an undirected graph G=(V,E)G = (V, E) is a subset of VV such that for any two vertices uu and vv in II, uu and vv are not adjacent, i.e., (u,v)∉E(u, v) \notin E.

Design a dynamic program to find the largest independent set in a tree.

Please explain the high-level idea of your answer in English or Chinese.

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

這一題的完整詳解

核心觀念

  • 獨立集 (Independent Set):圖 G=(V,E)G=(V,E) 中任意兩個頂點 u,v∈Iu,v\in I 都不相鄰,即 (u,v)∉E(u,v)\notin E。
  • 樹 (Tree):連通且無環的無向圖。樹的結構允許以「根」為基礎做自底向上的 DP,因為子樹之間僅透過父子邊相連。
  • 動態規劃 (Dynamic Programming) on Tree:對每個節點 xx 記錄兩種狀態
    1. 包含 xx(dp[x][1]dp[x][1])
    2. 不包含 xx(dp[x][0]dp[x][0])
      兩種狀態之遞迴關係僅與子節點的 dpdp 值有關,故可在一次 DFS 走訪中完成。

解題方法

  1. 選擇根節點
    任意將樹視為有根樹 (如選 11 為根)。之後以 DFS(或遞迴)自下而上計算 dpdp。

  2. 狀態定義

    • dp[u][1]dp[u][1]:以 uu 為根的子樹中,必須選取 uu 的最大獨立集大小。
    • dp[u][0]dp[u][0]:以 uu 為根的子樹中,不選取 uu 的最大獨立集大小。
  3. 遞迴關係

    • 若選取 uu,則所有子節點 vv 必須 不選(否則會與 uu 相鄰):
      dp[u][1]=1+∑v∈child(u)dp[v][0]dp[u][1] = 1 + \sum_{v\in \text{child}(u)} dp[v][0]
    • 若不選取 uu,子節點 vv 可以自行決定選或不選,採較大者:
      dp[u][0]=∑v∈child(u)max⁡(dp[v][0], dp[v][1])dp[u][0] = \sum_{v\in \text{child}(u)} \max\big(dp[v][0],\,dp[v][1]\big)
  4. 演算流程

🔒

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

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

免費註冊

第 6 題15 分

(15%) Consider an nn-node sorted singly linked list LL, where the first node (i.e., the head) stores the smallest data, the last node (i.e., the tail) stores the largest data, and the ithi^{th} node stores the ithi^{th} smallest data.

Given the address of LL's head and a key, is it possible to search for the key in LL in O(log⁡n)O(\log n) time? Please explain your answer.

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

這一題的完整詳解

核心觀念

  • 單向鏈結串列 (singly linked list):每個節點僅保存指向下一個節點的指標,無法直接跳至任意位置。
  • 排序性 (sorted):串列內的資料依遞增順序排列,但排序本身不提供隨機存取的能力。
  • 二分搜尋的條件:二分搜尋要求能在 O(1)O(1) 時間取得「中間」元素的地址,以便遞迴或迭代切割搜尋範圍。
  • 資訊理論下的搜尋下界:在只能順序訪問的資料結構中,搜尋任何目標的最壞情況時間下界為 Θ(n)\Theta(n),即使資料已排序。

解題方法

  1. 分析可行的操作

    • 從頭節點 headhead 開始,只能使用「指向下一個」的 next 指標前進。
    • 任意一次操作只能檢查當前節點的值並移至下一節點。
  2. 嘗試二分搜尋的思路

    • 二分搜尋需要在 O(1)O(1) 時間定位 LL 中間的節點。
    • 由於單向鏈結串列缺乏「指向任意位置」的指標,取得中間節點必須從頭逐一走過 n/2n/2 個節點,耗時 O(n)O(n)。
  3. 建立下界證明

    • 假設存在一個 O(log⁡n)O(\log n) 的演算法 AA,僅使用 headhead 的地址與比較操作。
    • 為了找出目標 kk,AA 必須在每一步決定「向左」或「向右」子區間。
    • 但「向左」子區間的左端必須是目前已知的最左節點,唯一可取得的下一個節點仍是 next,無法直接跳至子區間的中點。
🔒

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

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

免費註冊

第 7 題15 分

(15%) Design a polynomial-time algorithm for the following problem.

Input: An nn-node undirected graph GG.

Output:
"Yes", if there is a cycle of length at most n/2n/2 (i.e., a cycle that has at most n/2n/2 nodes) in GG;
"No", otherwise.

Please give the high-level idea of your algorithm and explain why it has polynomial running time.

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

這一題的完整詳解

核心觀念

  • 圖的週期 (cycle):在無向圖中,若存在一組不同的頂點 v1,…,vkv_1,\dots,v_k 使得相鄰兩點皆有邊相連且 v1=vkv_1=v_k,則稱為長度為 kk 的週期。
  • 最短週期 (girth):圖中所有週期的最小長度。判斷是否有長度 ≤n/2\le n/2 的週期,只要找到圖的最短週期,與 n/2n/2 比較即可。
  • Breadth‑First Search (BFS):在無向圖中,以一個起點 ss 為根的 BFS 樹可同時得到從 ss 到其他每個頂點的最短距離。當在 BFS 過程中發現一條「非樹」邊 (u,v)(u,v) 時,會形成一個以 ss 為端點的週期,長度為
    len(u,v)=dist⁡(s,u)+dist⁡(s,v)+1.\text{len}(u,v)=\operatorname{dist}(s,u)+\operatorname{dist}(s,v)+1.
    這個長度即是包含 ss 的 最短 週期之一。

解題方法

  1. 遍歷所有起點:對每一個頂點 s∈V(G)s\in V(G),執行一次 BFS,同時記錄從 ss 到每個頂點的距離 dist⁡s(⋅)\operatorname{dist}_s(\cdot)。
  2. 偵測非樹邊:在 BFS 探索過程中,若從當前頂點 uu 探索到已被拜訪的鄰點 vv,且 vv 不是 uu 的父節點,則此邊為「非樹」邊。此時計算
    c=dist⁡s(u)+dist⁡s(v)+1,c = \operatorname{dist}_s(u)+\operatorname{dist}_s(v)+1,
    並把 cc 與全局最小值 best\text{best} 更新(初始設為 ∞\infty)。
  3. 判斷結果:在所有 nn 次 BFS 完成後,若 best≤n2\text{best}\le \frac{n}{2},輸出 Yes;否則輸出 No。

算法偽碼

🔒

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

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

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

(10%) Consider a 500-node binary heap, whose array representation is stored in Arr.

Let pp be a node in the binary heap.

Further assume that uu is pp's child node and uu's key is stored at Arr[305].

第 8-a 題5 分

a. (5%) How to find pp's key in Arr?

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

這一題的完整詳解

核心觀念

  • 二元堆(binary heap)之陣列表示:

    • 若使用 1‑索引(最常見的教科書寫法),則
      • 父節點索引 = ⌊i2⌋\left\lfloor\dfrac{i}{2}\right\rfloor
      • 左子節點索引 = 2i2i,右子節點索引 = 2i+12i+1
    • 若使用 0‑索引(某些程式語言的實作),則
      • 父節點索引 = ⌊i−12⌋\left\lfloor\dfrac{i-1}{2}\right\rfloor
      • 子節點索引 = 2i+12i+1(左)與 2i+22i+2(右)
  • 題目條件:二元堆共有 500 個節點,子節點 uu 的鍵值儲存在 Arr[305],求其父節點 pp 的鍵值所在的陣列位置。


解題方法

  1. 確定索引制式

    • 本題僅給出「binary heap」與「array representation」的描述,未明示是 1‑索引或 0‑索引。
    • 兩種制式在本題 皆得到相同的父索引,因此無須另行判斷,只要使用下列公式即可。
  2. 套用父節點索引公式

    • 以 1‑索引為例:父節點 pp 的索引
      parentIdx=⌊3052⌋=152\text{parentIdx}= \left\lfloor \frac{305}{2} \right\rfloor = 152
    • 若採 0‑索引:父節點索引
      parentIdx=⌊305−12⌋=152\text{parentIdx}= \left\lfloor \frac{305-1}{2} \right\rfloor = 152

    因此 父節點 pp 的鍵值儲存在 Arr[152]。

🔒

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

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

免費註冊

第 8-b 題5 分

b. (5%) Does uu have a left child node in the binary heap? Please explain your answer.

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

這一題的完整詳解

核心觀念

  • 二元堆 (binary heap) 的陣列表示:若節點的索引為 ii,則
    • 左子節點的索引為 2i2i
    • 右子節點的索引為 2i+12i+1
    • 父節點的索引為 ⌊i/2⌋\left\lfloor i/2\right\rfloor
  • 存在性判斷:在一個含有 nn 個節點的二元堆中,只有當子節點的索引 ≤n\le n 時,該子節點才真的存在於堆內。

解題方法

  1. 已知 uu 的鍵值儲存在 Arr[305]Arr[305],因此 uu 在陣列中的索引為 iu=305i_u = 305。
  2. 計算 uu 的左子節點索引:
    ileft=2×iu=2×305=610i_{\text{left}} = 2 \times i_u = 2 \times 305 = 610
  3. 檢查左子節點索引是否在堆的範圍內。
🔒

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

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

免費註冊

其他考古題

政治大學《資料結構與演算法》其他年度

其他學校的電資其他考古題