114 專技高考高等考試 資訊技師 資料結構與資料庫及資料探勘 考古題詳解
第 一 題20 分
假設有一筆長度為 的資料,資料性質約有 90% 已排序(近乎有序),其餘 10% 隨機亂序。每筆資料大小為 100 bytes,儲存在主記憶體中。請回答:
(一)(10 分)在這種情況下,使用 Insertion Sort、Merge Sort、Quick Sort,請比較其平均與實際效能,並說明哪一種最適合。
(二)(10 分)在 Quick Sort 中,實作上可採用多種 pivot 選擇策略,例如第一個元素、最後一個元素與中位數三取法(median-of-three)。請說明這些策略對於上述資料進行反向(Reversed Order)排序時的效能影響,並指出最推薦的選擇方法及理由。
登入後即可作答並保存紀錄。
核心觀念
本題考查排序演算法的時間複雜度、資料初始有序程度對實際執行時間的影響,以及 Quick Sort 的 pivot 選取如何影響分割平衡。
- Insertion Sort 的時間取決於資料中的逆序數;越接近有序,所需移動越少。最佳情況為 ,平均與最差情況為 。
- Merge Sort 不受初始排列影響,最佳、平均及最差時間皆為 ;但通常需要 額外空間。
- Quick Sort 平均時間為 ,最差為 ;效能關鍵在 pivot 是否能將資料切分得平衡。
解題方法
(一)近乎有序資料的效能比較
資料筆數為 ,其中約九成已排序。假設這表示資料整體只需少量插入或移動即可恢復排序,則 Insertion Sort 的執行成本可用逆序數 估計:比較與移動量大致與 成正比,而不是一律達到 。
若另外假設其餘一成資料是分散在整筆資料中的隨機亂序元素,且這些元素各自可能與約九成的已排序元素形成逆序,則逆序數量級可達 。因此「90% 已排序」本身不足以保證 Insertion Sort 只有線性時間;實際效能仍取決於亂序元素的位置與逆序數。
| 演算法 | 平均時間 | 對本題資料的實際表現 | 額外空間 |
|---|---|---|---|
| Insertion Sort | 若逆序數很少,會很快;若亂序元素分散並造成大量逆序,仍可能接近平方時間 | ||
| Merge Sort | 執行時間穩定,不因近乎有序而顯著變快 | ||
| Quick Sort | 隨 pivot 與分割結果而變;不適當的 pivot 可能退化至 | 平均遞迴堆疊 |
以 估算,,而 。因此,若亂序部分足以造成大量逆序,Insertion Sort 的時間成本會遠高於兩種 排序法。
最適合的選擇:Merge Sort。 題目未精確界定「約 90% 已排序」如何分布,不能單憑此比例保證逆序數少,也不能保證 Quick Sort 的 pivot 分割平衡。Merge Sort 有 的最壞時間保證,效能不受輸入順序影響,適合作為穩定可靠的選擇。若已確認逆序數很少,Insertion Sort 才可能憑藉低額外空間與近線性執行時間勝出。
第 二 題20 分
給定一有向圖 ,其邊權重皆為正數。假設目前採用 Dijkstra 演算法計算單源(single-source)最短路徑,但在實際系統中,邊權重會隨時間動態變化,例如交通路網延遲。請回答:
(一)(10 分)為何 Dijkstra 不適合在權重頻繁變動的情境下重複執行?試設計一種「增量式更新演算法」(incremental update approach),能在部分邊權更新後有效地維護最短路徑樹(SPT)。
(二)(10 分)若圖使用 Fibonacci heap 實作 priority queue,請比較其時間複雜度與一般 binary heap 的差異。
登入後即可作答並保存紀錄。
核心觀念
Dijkstra 演算法適用於邊權重非負的有向圖。從來源點 出發,演算法以暫定距離最小的未確定頂點為順序,逐步確定最短距離,並記錄各頂點的前驅,以形成最短路徑樹(SPT)。
權重改變後,舊的距離標籤與前驅關係可能失效。若每次都從頭執行 Dijkstra,需重新掃描圖並重建整棵 SPT,無法利用上次計算結果;但這是「重複計算成本高」,不是 Dijkstra 在動態權重下必然無法執行。
(一)權重變動時的增量式更新
解題方法
維護目前的最短距離 、前驅 ,以及 SPT。權重更新時,只處理受影響的邊與頂點,並將新的距離改善沿出邊傳播。
對一條更新邊 ,新權重為 :
- 權重減少或新增邊:以 檢查是否改善 。若改善,更新 與前驅,並將 放入最小優先佇列。接著反覆取出距離最小的頂點,鬆弛其出邊,直到沒有更短距離可傳播。
- 權重增加或刪除邊:若該邊不在 SPT 中,原 SPT 的路徑不使用它,原距離維持不變。若它是 SPT 邊,則其子樹內頂點的原最短路徑失效;將受影響子樹標記為待重算,並從未受影響部分的邊界尋找替代路徑,再向子樹內傳播更新。若找不到替代路徑,相關頂點距離設為 。
權重增加可能使原本不在 SPT 中的邊成為替代路徑,因此受影響子樹的重算須納入所有可連接該子樹的候選邊。若同一批更新同時包含增減或刪除,應先依更新後的權重處理受影響區域,再傳播距離變化。
正確性與效率
每次鬆弛都檢查候選距離是否較小:
因此,距離改善會沿著可能受影響的路徑傳播。若只有少數邊更新且影響範圍有限,演算法只需處理局部區域;最壞情況下,更新可能影響全圖,成本仍會退化至接近重新執行 Dijkstra。
(二)Fibonacci heap 與 binary heap
令 為頂點數、 為邊數。使用最小優先佇列執行 Dijkstra 時:
第 三 題20 分
假設系統支援四種隔離等級:Read Uncommitted、Read Committed、Repeatable Read、Serializable。有兩個交易如下:
| Transaction T1 | Transaction T2 |
|---|---|
| Read(A) | |
| Write() | |
| Read(A) | Commit |
請回答:
(一)(10 分)在四種不同隔離等級下,T1 是否可能讀到不同的 值,並說明理由。
(二)(10 分)試分析異常現象(dirty read、non-repeatable read、phantom read)在何種隔離等級會發生。
登入後即可作答並保存紀錄。
核心觀念
本題考查資料庫隔離等級如何限制並行交易的讀取結果,以及三種常見讀取異常的定義。
- Dirty read(髒讀):讀取另一交易尚未提交的資料;若該交易回復,讀到的值便從未成為已提交資料。
- Non-repeatable read(不可重複讀):同一交易對同一筆資料讀取兩次,中間有另一交易修改並提交,因而讀到不同值。
- Phantom read(幻讀):同一交易以相同搜尋條件執行兩次範圍查詢,中間有另一交易新增或刪除符合條件的資料列,使查詢結果集合改變。
四種隔離等級由弱至強為:Read Uncommitted、Read Committed、Repeatable Read、Serializable。隔離等級愈高,能避免的並行異常愈多。
解題方法
追蹤題目中的兩次 Read(A),並確認第二次讀取前,T2 的 Write(A=100) 是否已提交。題目表格列出 T2 在第二次讀取前 Commit,但沒有給定 A 的初值,因此以下以 T1 第一次讀到的值為 ;若 ,才會出現不同值。
| 隔離等級 | T1 第一次讀取 | T2 寫入並提交後,T1 第二次讀取 | 判斷 |
|---|---|---|---|
| Read Uncommitted | 可能不同 | ||
| Read Committed | 可能不同 | ||
| Repeatable Read | 同一交易內必須可重複讀 | ||
| Serializable | 等同序列執行,不會因 T2 插入而改變 |
Read Uncommitted 允許讀取未提交資料,但本題 T2 在 T1 第二次讀取前已提交,因此即使在此等級,第二次讀取也可讀到新值。Read Committed 每次讀取只保證讀到已提交資料,不保證同一交易兩次讀取相同,因此也可讀到 。Repeatable Read 與 Serializable 則保證本例同一筆 A 在 T1 交易內重複讀取時維持原值。
異常現象分析
第 四 題20 分
假設一個 B+ Tree 索引的階(order)為 4,每個節點最多容納 4 個子節點。已存在以下鍵值:
請回答:
(一)(10 分)請繪出最終的 B+ Tree 結構(節點鍵值排列)。並執行範圍查詢:
請說明實際 I/O 步驟,並指明訪問哪些節點。
(二)(10 分)若鍵值 25 被刪除,請說明重新平衡(redistribution 或 merge)的過程。
登入後即可作答並保存紀錄。
核心觀念
B+ Tree 的階(order)為 4,表示內部節點最多有 4 個子節點,因而最多有 3 個分隔鍵。除根節點外,內部節點至少有 2 個子節點。葉節點最多有 3 個資料鍵;除根節點外,至少須有 2 個資料鍵。資料鍵只存於葉節點,葉節點依鍵值遞增並以鏈結串接,供範圍查詢循序掃描。
內部節點的分隔鍵採右子樹最小鍵值:分隔鍵 表示左側子樹鍵值小於 ,右側子樹鍵值大於或等於 。以下依序插入題目所列鍵值,並以此分隔鍵慣例作答。
解題方法與建樹
依序插入 。葉節點超過 3 個鍵時,分裂成兩個葉節點,並將右葉節點的最小鍵值複製至父節點作為分隔鍵;若父節點也溢位,則再向上分裂。
關鍵分裂過程如下:
- 插入 後,葉節點 溢位,分裂為 、,將 複製到根節點。
- 插入 後,葉節點 溢位,分裂為 、,將 插入根節點。
- 插入 後,葉節點 溢位,分裂為 、,將 插入根節點。
- 插入 後,葉節點 溢位,分裂為 、,將 插入根節點。根節點此時有 4 個分隔鍵而溢位,分裂後形成新的根節點。
最終結構為:
[18]
/ \
[12] [25 | 33]
/ \ / | \
[5 | 9] [12 | 15] [18 | 21] [25 | 31] [33 | 38]
葉節點鏈結順序為:
[5 | 9] → [12 | 15] → [18 | 21] → [25 | 31] → [33 | 38]
範圍查詢:
先從根節點依分隔鍵搜尋下界 。根節點 導向左子樹;接著在內部節點 選擇右側葉節點 。該葉節點中符合範圍者為 。
再沿葉節點鏈結向右掃描:
- 訪問 ,其中 符合範圍。
- 訪問 ,其中只有 符合;,停止掃描。
實際節點訪問順序為:
第 五 題20 分
某資料集有屬性 (二元),以及目標屬性 Class( / )。資料如下:
| Class | |
|---|---|
| T | |
| T | |
| T | |
| F | |
| F | |
| F |
請計算以下數值:
(一)(10 分)整體熵(Entropy of dataset)。
(二)(10 分)以屬性 為分裂條件的資訊增益(Information Gain),並請修改其中一筆的 Class 值,使屬性 的資訊增益提高。
登入後即可作答並保存紀錄。
核心觀念
本題考查目標屬性 Class 的熵,以及以屬性 分裂後的不純度變化。熵衡量類別分布的不確定性,資訊增益則衡量分裂後的不確定性減少多少。
若類別比例為 ,熵的公式為:
以屬性 分裂的資訊增益為:
其中 是 的子資料集。
解題方法
全體共有 6 筆資料,正類 有 3 筆,負類 有 3 筆,因此:
整體熵為 1 bit。
依 分裂:
- :3 筆,其中 有 2 筆、 有 1 筆。
- :3 筆,其中 有 1 筆、 有 2 筆。類別比例與 相反,因此熵相同:
兩個子集各占全體一半,加權後的條件熵為:
所以資訊增益為: