114 專技高考高等考試 資訊技師 資料結構與資料庫及資料探勘 考古題詳解

114 年・專技高考・高等考試・資訊技師
試題代碼 資料結構與資料庫及資料探勘

第 一 題20 分

假設有一筆長度為 n=106n=10^6 的資料,資料性質約有 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 的時間取決於資料中的逆序數;越接近有序,所需移動越少。最佳情況為 Θ(n)\Theta(n),平均與最差情況為 Θ(n2)\Theta(n^2)。
  • Merge Sort 不受初始排列影響,最佳、平均及最差時間皆為 Θ(nlog⁡n)\Theta(n\log n);但通常需要 Θ(n)\Theta(n) 額外空間。
  • Quick Sort 平均時間為 Θ(nlog⁡n)\Theta(n\log n),最差為 Θ(n2)\Theta(n^2);效能關鍵在 pivot 是否能將資料切分得平衡。

解題方法

(一)近乎有序資料的效能比較

資料筆數為 n=106n=10^6,其中約九成已排序。假設這表示資料整體只需少量插入或移動即可恢復排序,則 Insertion Sort 的執行成本可用逆序數 II 估計:比較與移動量大致與 n+In+I 成正比,而不是一律達到 n2n^2。

若另外假設其餘一成資料是分散在整筆資料中的隨機亂序元素,且這些元素各自可能與約九成的已排序元素形成逆序,則逆序數量級可達 0.1n×0.9n=Θ(n2)0.1n\times0.9n=\Theta(n^2)。因此「90% 已排序」本身不足以保證 Insertion Sort 只有線性時間;實際效能仍取決於亂序元素的位置與逆序數。

演算法平均時間對本題資料的實際表現額外空間
Insertion SortΘ(n2)\Theta(n^2)若逆序數很少,會很快;若亂序元素分散並造成大量逆序,仍可能接近平方時間Θ(1)\Theta(1)
Merge SortΘ(nlog⁡n)\Theta(n\log n)執行時間穩定,不因近乎有序而顯著變快Θ(n)\Theta(n)
Quick SortΘ(nlog⁡n)\Theta(n\log n)隨 pivot 與分割結果而變;不適當的 pivot 可能退化至 Θ(n2)\Theta(n^2)平均遞迴堆疊 Θ(log⁡n)\Theta(\log n)

以 n=106n=10^6 估算,n2=1012n^2=10^{12},而 nlog⁡2n≈2.0×107n\log_2 n\approx 2.0\times10^7。因此,若亂序部分足以造成大量逆序,Insertion Sort 的時間成本會遠高於兩種 nlog⁡nn\log n 排序法。

最適合的選擇:Merge Sort。 題目未精確界定「約 90% 已排序」如何分布,不能單憑此比例保證逆序數少,也不能保證 Quick Sort 的 pivot 分割平衡。Merge Sort 有 Θ(nlog⁡n)\Theta(n\log n) 的最壞時間保證,效能不受輸入順序影響,適合作為穩定可靠的選擇。若已確認逆序數很少,Insertion Sort 才可能憑藉低額外空間與近線性執行時間勝出。

🔒

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

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

免費註冊

第 二 題20 分

給定一有向圖 G=(V,E)G=(V,E),其邊權重皆為正數。假設目前採用 Dijkstra 演算法計算單源(single-source)最短路徑,但在實際系統中,邊權重會隨時間動態變化,例如交通路網延遲。請回答:

(一)(10 分)為何 Dijkstra 不適合在權重頻繁變動的情境下重複執行?試設計一種「增量式更新演算法」(incremental update approach),能在部分邊權更新後有效地維護最短路徑樹(SPT)。

(二)(10 分)若圖使用 Fibonacci heap 實作 priority queue,請比較其時間複雜度與一般 binary heap 的差異。

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

這一題的完整詳解

核心觀念

Dijkstra 演算法適用於邊權重非負的有向圖。從來源點 ss 出發,演算法以暫定距離最小的未確定頂點為順序,逐步確定最短距離,並記錄各頂點的前驅,以形成最短路徑樹(SPT)。

權重改變後,舊的距離標籤與前驅關係可能失效。若每次都從頭執行 Dijkstra,需重新掃描圖並重建整棵 SPT,無法利用上次計算結果;但這是「重複計算成本高」,不是 Dijkstra 在動態權重下必然無法執行。

(一)權重變動時的增量式更新

解題方法

維護目前的最短距離 d[v]d[v]、前驅 pred⁡[v]\operatorname{pred}[v],以及 SPT。權重更新時,只處理受影響的邊與頂點,並將新的距離改善沿出邊傳播。

對一條更新邊 (u,v)(u,v),新權重為 w′(u,v)w'(u,v):

  1. 權重減少或新增邊:以 d[u]+w′(u,v)d[u]+w'(u,v) 檢查是否改善 d[v]d[v]。若改善,更新 d[v]d[v] 與前驅,並將 vv 放入最小優先佇列。接著反覆取出距離最小的頂點,鬆弛其出邊,直到沒有更短距離可傳播。
  2. 權重增加或刪除邊:若該邊不在 SPT 中,原 SPT 的路徑不使用它,原距離維持不變。若它是 SPT 邊,則其子樹內頂點的原最短路徑失效;將受影響子樹標記為待重算,並從未受影響部分的邊界尋找替代路徑,再向子樹內傳播更新。若找不到替代路徑,相關頂點距離設為 ∞\infty。

權重增加可能使原本不在 SPT 中的邊成為替代路徑,因此受影響子樹的重算須納入所有可連接該子樹的候選邊。若同一批更新同時包含增減或刪除,應先依更新後的權重處理受影響區域,再傳播距離變化。

正確性與效率

每次鬆弛都檢查候選距離是否較小:

d[v]←min⁡{d[v], d[u]+w(u,v)}d[v] \leftarrow \min\{d[v],\, d[u]+w(u,v)\}

因此,距離改善會沿著可能受影響的路徑傳播。若只有少數邊更新且影響範圍有限,演算法只需處理局部區域;最壞情況下,更新可能影響全圖,成本仍會退化至接近重新執行 Dijkstra。

(二)Fibonacci heap 與 binary heap

令 ∣V∣|V| 為頂點數、∣E∣|E| 為邊數。使用最小優先佇列執行 Dijkstra 時:

🔒

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

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

免費註冊

第 三 題20 分

假設系統支援四種隔離等級:Read Uncommitted、Read Committed、Repeatable Read、Serializable。有兩個交易如下:

Transaction T1Transaction T2
Read(A)
Write(A=100A=100)
Read(A)Commit

請回答:

(一)(10 分)在四種不同隔離等級下,T1 是否可能讀到不同的 AA 值,並說明理由。

(二)(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 第一次讀到的值為 A0A_0;若 A0≠100A_0\ne100,才會出現不同值。

隔離等級T1 第一次讀取T2 寫入並提交後,T1 第二次讀取判斷
Read UncommittedA0A_0100100可能不同
Read CommittedA0A_0100100可能不同
Repeatable ReadA0A_0A0A_0同一交易內必須可重複讀
SerializableA0A_0A0A_0等同序列執行,不會因 T2 插入而改變

Read Uncommitted 允許讀取未提交資料,但本題 T2 在 T1 第二次讀取前已提交,因此即使在此等級,第二次讀取也可讀到新值。Read Committed 每次讀取只保證讀到已提交資料,不保證同一交易兩次讀取相同,因此也可讀到 100100。Repeatable Read 與 Serializable 則保證本例同一筆 A 在 T1 交易內重複讀取時維持原值。

異常現象分析

🔒

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

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

免費註冊

第 四 題20 分

假設一個 B+ Tree 索引的階(order)為 4,每個節點最多容納 4 個子節點。已存在以下鍵值:

[5,9,12,15,18,21,25,31,33,38][5, 9, 12, 15, 18, 21, 25, 31, 33, 38]

請回答:

(一)(10 分)請繪出最終的 B+ Tree 結構(節點鍵值排列)。並執行範圍查詢:

WHERE key BETWEEN 10 AND 30\text{WHERE key BETWEEN 10 AND 30}

請說明實際 I/O 步驟,並指明訪問哪些節點。

(二)(10 分)若鍵值 25 被刪除,請說明重新平衡(redistribution 或 merge)的過程。

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

這一題的完整詳解

核心觀念

B+ Tree 的階(order)為 4,表示內部節點最多有 4 個子節點,因而最多有 3 個分隔鍵。除根節點外,內部節點至少有 2 個子節點。葉節點最多有 3 個資料鍵;除根節點外,至少須有 2 個資料鍵。資料鍵只存於葉節點,葉節點依鍵值遞增並以鏈結串接,供範圍查詢循序掃描。

內部節點的分隔鍵採右子樹最小鍵值:分隔鍵 kk 表示左側子樹鍵值小於 kk,右側子樹鍵值大於或等於 kk。以下依序插入題目所列鍵值,並以此分隔鍵慣例作答。

解題方法與建樹

依序插入 5,9,12,15,18,21,25,31,33,385,9,12,15,18,21,25,31,33,38。葉節點超過 3 個鍵時,分裂成兩個葉節點,並將右葉節點的最小鍵值複製至父節點作為分隔鍵;若父節點也溢位,則再向上分裂。

關鍵分裂過程如下:

  1. 插入 1515 後,葉節點 [5,9,12,15][5,9,12,15] 溢位,分裂為 [5,9][5,9]、[12,15][12,15],將 1212 複製到根節點。
  2. 插入 2121 後,葉節點 [12,15,18,21][12,15,18,21] 溢位,分裂為 [12,15][12,15]、[18,21][18,21],將 1818 插入根節點。
  3. 插入 3131 後,葉節點 [18,21,25,31][18,21,25,31] 溢位,分裂為 [18,21][18,21]、[25,31][25,31],將 2525 插入根節點。
  4. 插入 3838 後,葉節點 [25,31,33,38][25,31,33,38] 溢位,分裂為 [25,31][25,31]、[33,38][33,38],將 3333 插入根節點。根節點此時有 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]

範圍查詢:10≤key≤3010 \leq \text{key} \leq 30

先從根節點依分隔鍵搜尋下界 1010。根節點 [18][18] 導向左子樹;接著在內部節點 [12][12] 選擇右側葉節點 [12∣15][12|15]。該葉節點中符合範圍者為 12,1512,15。

再沿葉節點鏈結向右掃描:

  • 訪問 [18∣21][18|21],其中 18,2118,21 符合範圍。
  • 訪問 [25∣31][25|31],其中只有 2525 符合;31>3031>30,停止掃描。

實際節點訪問順序為:

🔒

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

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

免費註冊

第 五 題20 分

某資料集有屬性 AA(二元),以及目標屬性 Class(++ / −-)。資料如下:

AAClass
T++
T++
T−-
F−-
F−-
F++

請計算以下數值:

(一)(10 分)整體熵(Entropy of dataset)。

(二)(10 分)以屬性 AA 為分裂條件的資訊增益(Information Gain),並請修改其中一筆的 Class 值,使屬性 AA 的資訊增益提高。

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

這一題的完整詳解

核心觀念

本題考查目標屬性 Class 的熵,以及以屬性 AA 分裂後的不純度變化。熵衡量類別分布的不確定性,資訊增益則衡量分裂後的不確定性減少多少。

若類別比例為 pip_i,熵的公式為:

H(S)=−∑ipilog⁡2piH(S)=-\sum_i p_i\log_2 p_i

以屬性 AA 分裂的資訊增益為:

IG(S,A)=H(S)−∑v∈{T,F}∣Sv∣∣S∣H(Sv)IG(S,A)=H(S)-\sum_{v\in\{T,F\}}\frac{|S_v|}{|S|}H(S_v)

其中 SvS_v 是 A=vA=v 的子資料集。

解題方法

全體共有 6 筆資料,正類 ++ 有 3 筆,負類 −- 有 3 筆,因此:

H(S)=−36log⁡236−36log⁡236=1H(S)=-\frac{3}{6}\log_2\frac{3}{6}-\frac{3}{6}\log_2\frac{3}{6}=1

整體熵為 1 bit。

依 AA 分裂:

  • A=TA=T:3 筆,其中 ++ 有 2 筆、−- 有 1 筆。
H(ST)=−23log⁡223−13log⁡213≈0.9183H(S_T)=-\frac{2}{3}\log_2\frac{2}{3}-\frac{1}{3}\log_2\frac{1}{3} \approx 0.9183
  • A=FA=F:3 筆,其中 ++ 有 1 筆、−- 有 2 筆。類別比例與 A=TA=T 相反,因此熵相同:
H(SF)≈0.9183H(S_F)\approx 0.9183

兩個子集各占全體一半,加權後的條件熵為:

H(S∣A)=36(0.9183)+36(0.9183)=0.9183H(S\mid A)=\frac{3}{6}(0.9183)+\frac{3}{6}(0.9183)=0.9183

所以資訊增益為:

🔒

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

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

免費註冊

其他考古題

資訊技師《資料結構與資料庫及資料探勘》其他年度