113 年 國立嘉義大學資訊管理學系碩士班《計算機概論》
第 1 題25 分
請解釋以下問題:
(a) 請詳細解釋物件導向程式設計 (Object-Oriented Programming) 三個特性? (6%)
(b) 請詳細解釋形成死結 (Deadlock) 的原因,並且說明該如何防止死結? (9%)
(c) 請定義演算法 (Algorithm) 與程式 (Program),並且說明兩者的差別? (5%)
(d) 請定義白箱測試 (glass-box testing) 與黑箱測試 (black-box testing),並說明兩者的差別? (5%)
登入後即可作答並保存紀錄。
本大題主要考驗學生對於計算機科學基礎概念的理解,涵蓋物件導向程式設計、作業系統中的死結問題、演算法與程式的區別,以及軟體測試的方法。
(a) 物件導向程式設計 (Object-Oriented Programming, OOP) 的三個特性
物件導向程式設計是一種程式設計典範,其核心思想是將現實世界中的事物抽象成「物件」(Object),物件之間透過訊息傳遞來協同工作。OOP 的三大基本特性為:
-
封裝 (Encapsulation):
- 概念:將資料(屬性)和操作這些資料的方法(行為)綁定在一起,形成一個獨立的單元,即物件。同時,它也隱藏了物件的內部實現細節,只暴露必要的介面給外部使用。
- 目的:
- 資料保護:防止外部程式直接存取或修改物件的內部狀態,確保資料的完整性與一致性。
- 模組化:將複雜系統分解成獨立、可管理的單元,降低程式的複雜度。
- 彈性與可維護性:當內部實現變更時,只要介面不變,外部程式就不需要修改。
-
繼承 (Inheritance):
- 概念:允許一個類別(子類別或衍生類別)繼承另一個類別(父類別或基底類別)的屬性與方法。子類別可以重用父類別的程式碼,並在其基礎上新增或修改功能。
- 目的:
- 程式碼重用:減少重複編寫相似的程式碼,提高開發效率。
- 建立層次結構:能夠建立類別間的「is-a」關係(例如,「狗」is-a「動物」),形成有層次的分類。
- 擴展性:方便在現有類別的基礎上擴展新功能。
-
多型 (Polymorphism):
- 概念:指允許不同類別的物件對同一訊息(方法呼叫)做出不同的回應。最常見的多型實現方式是方法的多載 (Overloading) 和方法的多載寫 (Overriding)。
- 目的:
- 彈性與靈活性:使得程式碼能夠處理多種類型的物件,而無需知道物件的具體型別。
- 簡化程式碼:例如,一個列表可以儲存不同型別的物件,並對它們執行相同的操作,每個物件會根據自己的型別做出適當的回應。
(b) 死結 (Deadlock) 的形成原因與防止方法
死結是指在多個行程(或執行緒)之間,因為互相等待對方釋放資源而導致所有行程都無法繼續執行,形成一種僵局。
-
形成原因:死結的發生必須同時滿足以下四個必要條件(Coffman conditions):
- 互斥 (Mutual Exclusion):資源不能被同時共享,一次只能被一個行程使用。
- 佔有並等待 (Hold and Wait):行程在持有至少一個資源的情況下,又去請求其他行程所佔有的資源。
- 不可剝奪 (No Preemption):資源一旦被行程佔有,就不能被強制剝奪,只能由佔有該資源的行程主動釋放。
- 循環等待 (Circular Wait):存在一個行程的等待鏈,其中每個行程都在等待鏈中下一個行程所佔有的資源,而鏈中的最後一個行程又在等待第一個行程所佔有的資源,形成一個封閉的循環。
-
防止死結的方法:
防止死結可以從破壞這四個必要條件中的任一項來實現:- 破壞互斥條件:對於某些資源,可以允許被共享(例如,唯讀的檔案),但這通常不適用於需要獨佔的資源(如印表機)。
- 破壞佔有並等待條件:
- 要求行程在開始執行前一次性申請所有需要的資源。
- 或者,行程在請求新資源時,必須釋放所有已佔有的資源。
- 缺點:可能導致資源利用率低下,且行程需要知道所有資源需求,實務上難以實現。
- 破壞不可剝奪條件:
- 如果一個行程請求的資源被其他行程佔有,則系統可以剝奪該行程已佔有的資源,並將其分配給請求者。
- 被剝奪資源的行程必須等待,直到能夠再次獲得所有資源為止。
- 缺點:實施複雜,可能導致行程狀態的保存與恢復開銷較大。
- 破壞循環等待條件:
- 為所有資源定義一個全序編號(例如,資源 R1, R2, ..., Rn)。
- 要求行程按資源編號遞增的順序請求資源。
- 這樣,如果行程 P1 請求 Ri,而行程 P2 請求 Rj,且 i < j,那麼 P2 就不可能請求 Ri,也就不會形成循環等待。
- 這是較為實用的方法之一。
除了上述方法,還可以採用死結預防 (Deadlock Prevention)、死結避免 (Deadlock Avoidance)(如銀行家演算法 Banker's Algorithm)和死結偵測與恢復 (Deadlock Detection and Recovery) 等策略。
(c) 演算法 (Algorithm) 與程式 (Program) 的區別
- 演算法 (Algorithm):
- 定義:解決特定問題的一系列清晰、有限、明確的步驟或規則。它是一種邏輯概念,描述了如何從輸入得到輸出。
第 2 題25 分
請解釋以下問題:
(a) Router 跟 Switch 都是構成網路架構的設備,但是兩者之間的用途是不同的,請定義兩者的功能,並且說明兩者的差別? (7%)
(b) 在建構自己的網路服務的時候,可以自己購買主機並且租用固定 IP 來架設 Client-Server 的服務,但是也可以尋找雲端服務的業者租用雲端服務。請就資料儲存、費用成本、可擴充性與系統可靠性來討論 Client-Server 與 Cloud Computing 的差別? (12%)
(c) ping 指令常用來確定與另外一台電腦連線是否正常,當我們使用 ping 指令時,何種封包會被用來傳送到指定位址? (3%) 在 OSI 模
型當中,此封包所使用到的哪一層的通訊協定? (3%)
登入後即可作答並保存紀錄。
本大題主要考驗學生對於網路基礎設備、網路服務模式,以及網路通訊協定的理解。
(a) Router 與 Switch 的功能與差別
Router (路由器) 和 Switch (交換器) 都是網路設備,用於連接不同的網路或設備,但它們工作在不同的網路層級,處理的資訊和功能也有所不同。
-
Switch (交換器):
- 功能:主要用於在 區域網路 (LAN) 內部連接多個終端設備(如電腦、印表機),並在這些設備之間轉發資料。
- 工作層級:主要工作在 OSI 模型中的 資料連結層 (Data Link Layer, Layer 2)。
- 工作原理:透過學習 MAC 位址(硬體位址)來建立 MAC 位址表。當收到一個資料幀 (frame) 時,它會檢查目標 MAC 位址,並將該幀轉發到對應的連接埠 (port)。
- 轉發依據:MAC 位址。
- 廣播域/碰撞域:每個連接埠都是一個獨立的碰撞域,但所有連接埠通常屬於同一個廣播域(除非有 VLAN 設定)。
- 用途:連接同一網路內的設備,提高網路內部通訊效率。
-
Router (路由器):
- 功能:主要用於連接 不同的網路,例如將家庭網路連接到網際網路 (Internet),或連接企業內部的不同網段。它負責在不同網路之間尋找最佳路徑來轉發資料封包。
- 工作層級:主要工作在 OSI 模型中的 網路層 (Network Layer, Layer 3)。
- 工作原理:透過 IP 位址來決定資料封包的轉發路徑。它維護路由表 (routing table),根據目標 IP 位址查詢最佳路徑,並將封包轉發到下一個路由器或目標網路。
- 轉發依據:IP 位址。
- 廣播域/碰撞域:路由器連接的每個介面(port)都屬於不同的廣播域和碰撞域。路由器本身不傳播廣播封包。
- 用途:連接不同網路、實現網際網路的互聯。
-
差別總結:
特性 Switch (交換器) Router (路由器) 主要功能 在 LAN 內連接設備、轉發資料 連接不同網路、決定資料轉發路徑 工作層級 資料連結層 (Layer 2) 網路層 (Layer 3) 轉發依據 MAC 位址 IP 位址 連接對象 同一網路內的設備 不同網路、不同網段 廣播域 通常為一個(除非有 VLAN) 每個介面為獨立廣播域 衝突域 每個連接埠為獨立衝突域 每個介面為獨立衝突域 常見應用 辦公室、家庭網路內部設備連接 區分不同網段、連接 Internet、企業內部網路連接
(b) Client-Server 與 Cloud Computing 的差別 (資料儲存、費用成本、可擴充性、系統可靠性)
Client-Server (C/S) 架構是一種傳統的網路應用架構,而 Cloud Computing (雲端運算) 則是一種較新的服務提供模式。
- Client-Server (C/S) 架構:
- 概念:一個或多個伺服器 (Server) 提供資源或服務,而眾多客戶端 (Client) 透過網路向伺服器請求這些資源或服務。伺服器通常是自行購買、部署和維護的。
- 資料儲存:資料通常儲存在客戶端本地或企業自建的伺服器上。
- 費用成本:初期硬體設備購買、機房建置、電力、網路、維護人員等成本較高。後續維護、升級也需持續投入。
- 可擴充性:擴充性較差。
第 3 題25 分
嘉義大學合作社的銷售系統資料庫中有三個資料表,分別是訂單資料表 orders、訂單明細資料表 items 和客戶資料表 customers。其中訂單資料表中包含訂單編號欄位 order_id、客戶編號欄位 customer_id 和訂單日期欄位 order_date。訂單明細資料表中包含訂單編號欄位 order_id、產品編號欄位 product_id、產品名稱欄位 product_name 和數量欄位 quantity。客戶資料表中包含客戶編號欄位 customer_id 和客戶姓名欄位 customer_name。
orders
| order_id | customer_id | order_date |
|---|---|---|
| 10301 | A01 | 2024/1/3 |
| 10302 | A02 | 2023/12/7 |
| 10303 | A01 | 2023/12/7 |
| 10304 | A02 | 2023/11/7 |
customers
| customer_id | customer_name |
|---|---|
| A01 | Alan |
| A02 | Jack |
items
| order_id | product_id | product_name | quantity |
|---|---|---|---|
| 10301 | P01 | Ncyu Milk | 8 |
| 10301 | P03 | Ncyu Cup | 10 |
| 10302 | P02 | Ncyu Soy Sauce | 9 |
| 10302 | P03 | Ncyu Cup | 20 |
| 10303 | P01 | Ncyu Milk | 10 |
| 10304 | P02 | Ncyu Soy Sauce | 13 |
請回答下面問題:
(a) 請寫一 SQL 查詢,顯示每筆訂單的訂單編號、訂單日期和下訂單的客戶姓名? (5%)
(b) 請寫一 SQL 查詢,顯示 2023/12/7 所有客戶的訂購明細,訂購明細須包含客戶姓名、產品名稱和數量? (5%)
(c) 請寫一 SQL 查詢,顯示客戶「Alan」於 2023 年期間採購的產品明細,產品明細須包含訂單日期、產品名稱和數量? (5%)
(d) 客戶來電客訴訂單編號 10303 的訂單,Ncyu Milk 只送了 9 瓶,請寫一 SQL 更新,將該訂單中 Ncyu Milk 的數量改成 9? (5%)
(e) 請說明何謂關聯式資料庫第二正規化 (2NF),上面的資料表是 2NF 嗎?如果不是,請對該資料表進行第二正規化? (5%)
登入後即可作答並保存紀錄。
核心觀念
本題考查三個關聯式資料庫重點:
- 使用
JOIN連結具有共同欄位的資料表。 - 使用
WHERE篩選日期、客戶或訂單條件。 - 使用
UPDATE修改指定資料列。 - 判斷資料表是否符合第二正規化(Second Normal Form, 2NF)。
資料表之間的關聯如下:
orders.customer_id = customers.customer_idorders.order_id = items.order_iditems.product_id對應產品資料
(a) 顯示每筆訂單的訂單編號、訂單日期與客戶姓名
解題方法
訂單編號與訂單日期在 orders,客戶姓名在 customers,因此以 customer_id 作為連接條件。
SELECT
o.order_id,
o.order_date,
c.customer_name
FROM orders AS o
JOIN customers AS c
ON o.customer_id = c.customer_id;
查詢結果如下:
| order_id | order_date | customer_name |
|---|---|---|
| 10301 | 2024/1/3 | Alan |
| 10302 | 2023/12/7 | Jack |
| 10303 | 2023/12/7 | Alan |
| 10304 | 2023/11/7 | Jack |
解題技巧
JOIN 的條件應使用兩表代表同一筆資料的欄位。本題是以客戶編號連接,而不是以客戶姓名連接,因為編號通常具有唯一性且是正式識別欄位。
(b) 顯示 2023/12/7 所有客戶的訂購明細
解題方法
需要顯示:
- 客戶姓名:來自
customers - 產品名稱與數量:來自
items - 日期條件:來自
orders
因此需連結三個資料表:
SELECT
c.customer_name,
i.product_name,
i.quantity
FROM orders AS o
JOIN customers AS c
ON o.customer_id = c.customer_id
JOIN items AS i
ON o.order_id = i.order_id
WHERE o.order_date = DATE '2023-12-07';
若使用不支援 DATE 'YYYY-MM-DD' 語法的資料庫,也可寫成:
WHERE o.order_date = '2023/12/7';
查詢結果如下:
| customer_name | product_name | quantity |
|---|---|---|
| Jack | Ncyu Soy Sauce | 9 |
| Jack | Ncyu Cup | 20 |
| Alan | Ncyu Milk | 10 |
解題技巧
日期條件應放在訂單資料表的 order_date 欄位上。不要只連結 items 與 customers,因為 items 沒有訂單日期,無法判斷商品屬於哪一天的訂單。
(c) 顯示 Alan 於 2023 年期間採購的產品明細
解題方法
條件包含:
- 客戶姓名為
Alan - 訂單日期介於 2023 年 1 月 1 日至 2023 年 12 月 31 日
- 顯示訂單日期、產品名稱、數量
SELECT
o.order_date,
i.product_name,
i.quantity
FROM orders AS o
JOIN customers AS c
ON o.customer_id = c.customer_id
JOIN items AS i
ON o.order_id = i.order_id
WHERE c.customer_name = 'Alan'
AND o.order_date >= DATE '2023-01-01'
AND o.order_date < DATE '2024-01-01'
ORDER BY o.order_date, o.order_id;
查詢結果如下:
| order_date | product_name | quantity |
|---|---|---|
| 2023/12/7 | Ncyu Milk | 10 |
為何使用小於 2024 年 1 月 1 日
若 order_date 欄位包含時間,直接使用:
o.order_date <= DATE '2023-12-31'
在某些資料庫中可能只涵蓋到 2023/12/31 00:00:00。使用「大於等於 2023/1/1 且小於 2024/1/1」可完整涵蓋 2023 年所有日期與時間。
解題技巧
查詢「某一整年」時,可使用:
日期 >= 該年 1 月 1 日
AND 日期 < 次年 1 月 1 日
這種寫法比對日期函數進行轉換更穩定,也較容易使用索引。
(d) 將訂單 10303 中 Ncyu Milk 的數量改成 9
解題方法
使用 UPDATE 修改 items 資料表,並以訂單編號與產品名稱同時限制更新範圍:
UPDATE items
SET quantity = 9
WHERE order_id = 10303
AND product_name = 'Ncyu Milk';
更新前,訂單 10303 的資料為:
| order_id | product_id | product_name | quantity |
|---|---|---|---|
| 10303 | P01 | Ncyu Milk | 10 |
更新後:
| order_id | product_id | product_name | quantity |
第 4 題25 分
安德森鳶尾花卉資料集 (英文: Anderson's Iris data set),也稱鳶尾花卉資料集 (英文: Iris flower data set),是一資料探勘課程中常用的範例資料集。它最初是埃德加·安德森從加拿大加斯帕半島上的鳶尾屬花朵中提取的形態學變異資料,在資料探勘課程教學中,該資料集常被使用來建立分類器。資料集中包含了鳶尾屬下的三個品種,分別是山鳶尾 setosa、變色鳶尾 versicolor 和維吉尼亞鳶尾 virginica。假設你正在設計一個多類別分類模型,以區分這三種花卉,在測試集上的混淆矩陣如下:
| Predicted \ Ground Truth | setosa | versicolor | virginica |
|---|---|---|---|
| setosa | 6 | 1 | 3 |
| versicolor | 2 | 8 | 0 |
| virginica | 2 | 1 | 7 |
請回答下面問題:
(a) 計算模型的總體準確度 (Overall Accuracy)? (5%)
(b) 計算每個類別的精確度 (Precision) 和總體精確度 (Precision)? (5%)
(c) 計算每個類別的召回率 (Recall) 和總體召回率 (Recall)? (5%)
(d) 計算每個類別的 F1 分數和總體的 F1 分數? (5%)
(e) 要如何知道模型有無過擬合 (Overfitting) 或擬合不足 (Underfitting)? (5%)
登入後即可作答並保存紀錄。
本大題考驗學生對機器學習分類模型評估指標的理解,包含準確度、精確度、召回率、F1 分數,以及過擬合與擬合不足的概念。
首先,我們需要從混淆矩陣 (Confusion Matrix) 中提取必要的資訊:
- True Positive (TP): 被正確預測為該類別的樣本數。
- False Positive (FP): 被錯誤預測為該類別的其他類別樣本數。
- True Negative (TN): 被正確預測為非該類別的樣本數。
- False Negative (FN): 被錯誤預測為非該類別的該類別樣本數。
混淆矩陣中,行代表「預測 (Predicted)」,列代表「實際 (Ground Truth)」。
對角線上的值 (setosa-setosa, versicolor-versicolor, virginica-virginica) 是 TP。
非對角線上的值是 FP 和 FN。
類別:setosa
- TP (setosa 預測為 setosa): 6
- FP (其他類別預測為 setosa): 1 (versicolor 預測為 setosa) + 3 (virginica 預測為 setosa) = 4
- FN (setosa 預測為其他類別): 2 (setosa 預測為 versicolor) + 2 (setosa 預測為 virginica) = 4
- TN (其他類別預測為非 setosa): 8 (versicolor 預測為 versicolor) + 0 (versicolor 預測為 virginica) + 1 (virginica 預測為 versicolor) + 7 (virginica 預測為 virginica) = 16
類別:versicolor
- TP (versicolor 預測為 versicolor): 8
- FP (其他類別預測為 versicolor): 1 (setosa 預測為 versicolor) + 1 (virginica 預測為 versicolor) = 2
- FN (versicolor 預測為其他類別): 2 (versicolor 預測為 setosa) + 0 (versicolor 預測為 virginica) = 2
- TN (其他類別預測為非 versicolor): 6 (setosa 預測為 setosa) + 3 (setosa 預測為 virginica) + 2 (virginica 預測為 setosa) + 7 (virginica 預測為 virginica) = 18
類別:virginica
- TP (virginica 預測為 virginica): 7
- FP (其他類別預測為 virginica): 3 (setosa 預測為 virginica) + 0 (versicolor 預測為 virginica) = 3
- FN (virginica 預測為其他類別): 2 (virginica 預測為 setosa) + 1 (virginica 預測為 versicolor) = 3
- TN (其他類別預測為非 virginica): 6 (setosa 預測為 setosa) + 1 (setosa 預測為 versicolor) + 2 (versicolor 預測為 setosa) + 8 (versicolor 預測為 versicolor) = 17
總體樣本數 (Total Samples):
所有 Ground Truth 的總和:(6+1+3) + (2+8+0) + (2+1+7) = 10 + 10 + 10 = 30
或所有 Predicted 的總和:(6+2+2) + (1+8+1) + (3+0+7) = 10 + 10 + 10 = 30
總樣本數 = 30。
(a) 計算模型的總體準確度 (Overall Accuracy)
-
公式:Overall Accuracy = (Sum of all TP) / (Total Samples)
或者,Overall Accuracy = (TP_setosa + TP_versicolor + TP_virginica) / Total Samples -
計算:
TP_setosa = 6
TP_versicolor = 8
TP_virginica = 7
Total Samples = 30Overall Accuracy = (6 + 8 + 7) / 30 = 21 / 30
-
結果:Overall Accuracy = 0.7
【答案】
Overall Accuracy = 0.7
(b) 計算每個類別的精確度 (Precision) 和總體精確度 (Precision)
-
精確度 (Precision) 的公式:Precision = TP / (TP + FP)
它衡量的是在所有被預測為某類別的樣本中,有多少是真正屬於該類別的。-
setosa 的 Precision:
TP = 6, FP = 4
Precision_setosa = 6 / (6 + 4) = 6 / 10 = 0.6 -
versicolor 的 Precision:
TP = 8, FP = 2
Precision_versicolor = 8 / (8 + 2) = 8 / 10 = 0.8 -
virginica 的 Precision:
TP = 7, FP = 3
Precision_virginica = 7 / (7 + 3) = 7 / 10 = 0.7
-
-
總體精確度 (Overall Precision):
在多類別分類中,「總體精確度」通常不是一個標準的、單獨定義的指標。通常會計算「宏平均精確度 (Macro-averaged Precision)」或「微平均精確度 (Micro-averaged Precision)」。- 宏平均精確度 (Macro-averaged Precision):計算每個類別的 Precision,然後取算術平均值。
Macro-Precision = (Precision_setosa + Precision_versicolor + Precision_virginica) / 3
Macro-Precision = (0.6 + 0.8 + 0.7) / 3 = 2.1 / 3 = 0.7 - 微平均精確度 (Micro-averaged Precision):將所有類別的 TP 和 FP 加總後計算。
Total TP = 6 + 8 + 7 = 21
Total FP = 4 + 2 + 3 = 9
Micro-Precision = Total TP / (Total TP + Total FP) = 21 / (21 + 9) = 21 / 30 = 0.7
在這種情況下,宏平均和微平均結果相同,且都等於總體準確度。
- 宏平均精確度 (Macro-averaged Precision):計算每個類別的 Precision,然後取算術平均值。
【答案】
- setosa Precision: 0.6
- versicolor Precision: 0.8
- virginica Precision: 0.7
- 總體精確度 (Macro-averaged Precision): 0.7
(c) 計算每個類別的召回率 (Recall) 和總體召回率 (Recall)