參考答案 / 清大 / 107 年 計算機概論

國立清華大學資訊系統與應用研究所

清大 107 年資應所 計算機概論 參考答案

共 17 題

參考答案 PDF各校參考答案的 PDF,訂閱考試資源分享信後會寄到您的信箱。訂閱領取 PDF

參考答案由作者與 AI 討論後逐題確認,不是各校公布的標準答案;若與各校公布不同,以各校為準。
最後更新:2026 年 11 月 3 日。發現錯誤歡迎來信。

1(A)三筆記錄雜湊到 11 個 bucket 的碰撞機率

考點:Hash Function 與雜湊表(Hash Table)基本概念

1−11×10×9113=31121≈0.256

1(B)11 個 bucket 下碰撞機率超過一半所需的記錄數

考點:Hash Function 與雜湊表(Hash Table)基本概念

5 筆。4 筆時碰撞機率約 0.459,5 筆時約 0.656,首次超過一半。

2光線在平面上的反射點

考點:電腦圖學基礎:3D 繪圖流程(Modeling/Rendering/Displaying)、光線反射類型與平面法向量

平面 y+z=2;(0,2,1) 對平面的鏡射點為 (0,1,0);光源 (0,1,2) 與 (0,1,0) 的連線交平面於 P=(0,1,1)。

3(A)農夫過河問題的產生式系統

考點:產生式系統(Production System)與狀態圖:狀態、規則與控制系統

  1. 狀態:以 (農夫, 狐狸, 鵝, 豆子) 表示四者各在左岸 L 或右岸 R,共 24=16 種組合。
  2. 合法狀態:不可出現「狐狸與鵝同岸而農夫不在」或「鵝與豆子同岸而農夫不在」。
  3. 起始狀態 (L, L, L, L),目標狀態 (R, R, R, R)。
  4. 產生規則(農夫每次必定過河,船上最多再帶一樣與他同岸的東西):
    • 農夫獨自過河。
    • 農夫帶狐狸過河。
    • 農夫帶鵝過河。
    • 農夫帶豆子過河。 規則套用後的新狀態必須合法才可採用。
  5. 控制系統:從起始狀態依規則產生新狀態,以 BFS 等方式搜尋狀態圖,找到通往目標狀態的路徑。

3(B)農夫過河問題的狀態圖

考點:產生式系統(Production System)與狀態圖:狀態、規則與控制系統

(如手寫圖)

狀態以 (農夫, 狐狸, 鵝, 豆子) 表示,L 為原岸、R 為對岸:

狀態 規則 下一狀態
(L, L, L, L) 帶鵝過河 (R, L, R, L)
(R, L, R, L) 獨自返回 (L, L, R, L)
(L, L, R, L) 帶狐狸過河 (R, R, R, L)
(L, L, R, L) 帶豆子過河 (R, L, R, R)
(R, R, R, L) 帶鵝返回 (L, R, L, L)
(R, L, R, R) 帶鵝返回 (L, L, L, R)
(L, R, L, L) 帶豆子過河 (R, R, L, R)
(L, L, L, R) 帶狐狸過河 (R, R, L, R)
(R, R, L, R) 獨自返回 (L, R, L, R)
(L, R, L, R) 帶鵝過河 (R, R, R, R)
3(B) 參考答案圖

4三艘船測出最大載磚數的最少測試策略

考點:雞蛋掉落問題(Egg Drop Problem):有限樣品下的最少測試次數

最差情況最少 9 次。剩 t 次、b 艘船可分辨 F(t,b)=∑i=1b(ti) 個值,F(8,3)=92<99≤F(9,3)=129。

  • 三艘船:依序載 38、67、89、100 塊(每次比上次多 F(t−1,2)+1,超過 100 時載 100)。
  • 沉一艘後剩兩艘、剩 t 次:每次比已知可載的值多 t 塊,不超過沉船載重減 1。
  • 只剩一艘:從已知可載的值加 1 起逐塊測試。

5(A)遞迴式 T(n) = T(n − 1) + n 的漸近上界

考點:Master Theorem 三種基本情形(Case 1/2/3)與 Strassen's 矩陣乘法範例

展開得 T(n)=T(1)+n(n+1)2−1,T(n)=O(n2)(同時為 Θ(n2))。

5(B)遞迴式 T(n) = 2T(n/2) + 2n 的漸近上界

考點:Master Theorem 三種基本情形(Case 1/2/3)與 Strassen's 矩陣乘法範例

Master Theorem Case 2:nlog22=n,f(n)=2n=Θ(n),T(n)=O(nlogn)(同時為 Θ(nlogn))。

6樹的最小頂點覆蓋 O(n) 演算法

考點:Tree 的 Minimum Vertex Cover:後序走訪 Greedy 與 DP 的 O(n) 解法

演算法(任選一點為根,以後序走訪由葉往根處理):

TreeVertexCover(T, r)
    for each vertex v in postorder of T rooted at r
        inX[v] = false
        for each child c of v
            if inX[c] == false
                inX[v] = true
    return { v | inX[v] == true }

正確性:

  1. 是頂點覆蓋:樹的每條邊都是某個節點 v 與其子節點 c 之間的邊;若 c 不在 X,演算法就把 v 放進 X,所以每條邊至少有一端在 X。
  2. 大小最小:對任一葉節點 c 與其父節點 v,邊 (v,c) 必須被覆蓋。若某最小覆蓋選了 c,把 c 換成 v 仍是覆蓋(c 只連到 v),大小不變,所以存在包含 v 的最小覆蓋。選定 v 後,與 v 相連的邊都已覆蓋,移除 v 與其子樹中已處理的部分,剩下的森林依同樣理由遞迴,每一步的選擇都可延伸成最小覆蓋。後序走訪正是依序處理「子節點都已決定、自己尚未決定」的節點。

時間:後序走訪每個節點一次、每條邊檢查一次,樹有 n−1 條邊,總時間 O(n)。

7(A)奇數分支度頂點的個數為奇數

考點:握手定理與 Euler Path/Euler Circuit 的存在條件

錯誤。分支度總和 =2|E| 為偶數,奇數分支度頂點的個數必為偶數。

7(B)Quick Sort 與 Merge Sort 是否皆為最佳排序演算法

考點:Merge Sort 與 Heap Sort 演算法邏輯、Quick Sort:DS版/Algo版 Partition 邏輯與 Worst-case 成因(Partition Three/Three-way Partition)

錯誤。比較式排序最差下界為 Ω(nlogn);Merge Sort 最差 Θ(nlogn) 為最佳,Quick Sort 最差 Θ(n2) 不是。

7(C)稠密圖上 Kruskal 與 Prim 的速度比較

考點:Minimum Spanning Tree(MST)與求解演算法(Kruskal's、Prim's)

錯誤。稠密圖 |E|=Θ(|V|2),Kruskal 為 O(|V|2log|V|),以陣列實作的 Prim 為 O(|V|2),Prim 較快。

7(D)SAT 為 NP-complete 是否代表沒有多項式時間演算法

考點:NP-Hard 與 NPC

錯誤。SAT 是 NP-complete,但 P 是否等於 NP 尚未解決,「沒有多項式時間演算法」並未被證明;若 P = NP 則存在。

7(E)圖是否存在 Euler Path

考點:握手定理與 Euler Path/Euler Circuit 的存在條件

錯誤。上中、左中、右中、下中的分支度皆為 5,奇數分支度頂點有 4 個,超過 2 個,不存在 Euler Path。

8開源軟體與閉源軟體的定義、例子與差異

考點:開源授權條款比較:GPL、MIT、Apache License

(一)開源軟體:原始碼公開,授權允許使用、修改與再散布。例:Linux 核心、Mozilla Firefox。

(二)閉源軟體:原始碼不公開,只能依授權合約使用。例:Microsoft Windows、Adobe Photoshop。

(三)差異:原始碼是否公開、使用者能否修改與再散布、營利方式(開源多靠支援服務,閉源多賣授權或訂閱)。

9邊界值分析與年齡欄位的測試案例

考點:軟體測試:黑箱測試、白箱測試與邊界值分析

(一)邊界值分析(Boundary Value Analysis, BVA)是黑箱測試技術:錯誤多發生在輸入範圍的邊界(如 < 誤寫成 <=),所以在每個有效範圍的邊界上、邊界內側與邊界外側取值設計測試案例。

(二)有效範圍為 18~65:

測試值 位置 預期結果
17 下界外側 拒絕(無效)
18 下界 接受
19 下界內側 接受
64 上界內側 接受
65 上界 接受
66 上界外側 拒絕(無效)

17 與 66 檢查系統是否正確拒絕範圍外的年齡,18 與 65 檢查邊界本身是否被接受,19 與 64 確認邊界附近的有效值也正常。

10以三個堆疊交換相鄰兩筆資料

考點:Stack 與 Queue 定義與應用場景

三個堆疊為 A、B、C,要交換 A 中相鄰的兩筆資料 x(較上)與 y(緊接在 x 下方),假設 A 中的資料值互不相同:

SwapAdjacent(A, B, C, x)
    count = 0
    while top(A) != x            // 把 x 上方的資料暫存到 B
        move top(A) to B
        count = count + 1
    move top(A) to C             // x 移到 C
    move top(A) to B             // y 移到 B
    move top(C) to A             // x 回到 A,位於原本 y 的位置
    move top(B) to A             // y 放回 A,位於 x 之上
    repeat count times           // 把暫存的資料依原順序放回 A
        move top(B) to A

範例:A 由底到頂為 1, 2, 3, 4, 5,交換 2 與 3(x=3、y=2)。

步驟 A(底→頂) B(底→頂) C
初始 1, 2, 3, 4, 5
5、4 移到 B 1, 2, 3 5, 4
3 移到 C 1, 2 5, 4 3
2 移到 B 1 5, 4, 2 3
3 移回 A 1, 3 5, 4, 2
2 移回 A 1, 3, 2 5, 4
4、5 移回 A 1, 3, 2, 4, 5

清大其他年份