114 公務人員升官等薦任 資訊處理 資料結構 考古題詳解

114 年・公務人員升官等・薦任・資訊處理
試題代碼 資料結構

第 一 題22 分

費伯納西數列(Fibonacci Sequence)定義如下:

F(0)=0F(0)=0,F(1)=1F(1)=1,

F(n)=F(n−1)+F(n−2),n≥2F(n)=F(n-1)+F(n-2),\quad n\geq 2

請完成下列各題:

(一) 使用遞迴方法(Recursion)撰寫虛擬碼,計算第 nn 項的費伯納西數。(8 分)

(二) 使用動態規劃方法(Dynamic Programming)撰寫虛擬碼,透過自底向上(Bottom-up)的方式計算第 nn 項的費伯納西數。(8 分)

(三) 比較兩個方法的時間複雜度(Time Complexity)。(6 分)

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

這一題的完整詳解

核心觀念

本題考查費伯納西數列的遞迴定義,以及遞迴與動態規劃的實作方式和時間複雜度。

數列定義為:

F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥2)F(0)=0,\qquad F(1)=1,\qquad F(n)=F(n-1)+F(n-2)\quad(n\geq 2)

直接遞迴會重複計算許多相同的子問題;自底向上的動態規劃則依序計算並保存已求出的數值,避免重複計算。

(一)遞迴方法

遇到 n=0n=0 或 n=1n=1 時,直接回傳定義的基底值;其他情況依定義將前兩項相加。

FibonacciRecursive(n)
 if n = 0
 return 0
 if n = 1
 return 1
 return FibonacciRecursive(n - 1)
 + FibonacciRecursive(n - 2)

以 n=5n=5 為例:

F(5)=F(4)+F(3)=(F(3)+F(2))+(F(2)+F(1))=5F(5)=F(4)+F(3) =(F(3)+F(2))+(F(2)+F(1)) =5

此方法直接呈現數列的數學定義,但會在遞迴展開時重複計算,例如 F(3)F(3) 在計算 F(5)F(5) 時會被求出不只一次。

(二)自底向上的動態規劃

從已知的基底值 F(0)F(0)、F(1)F(1) 開始,依序計算 F(2)F(2) 至 F(n)F(n),並將每一項保存下來。

FibonacciBottomUp(n)
 if n = 0
 return 0

 建立陣列 F[0..n]
 F[0] ← 0
 F[1] ← 1

 for i ← 2 to n
 F[i] ← F[i - 1] + F[i - 2]

 return F[n]

例如計算 F(5)F(5):

F[0]=0,F[1]=1F[0]=0,\quad F[1]=1 F[2]=1,F[3]=2,F[4]=3,F[5]=5F[2]=1,\quad F[3]=2,\quad F[4]=3,\quad F[5]=5
🔒

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

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

免費註冊

第 二 題22 分

已知 B+-tree 的階數(Order)為 m=3m=3。葉節點至多可存放 2 個鍵值,至少須存放 1 個鍵值;內部節點至多可有 3 個子節點,至少須有 2 個子節點。

當節點因插入而溢位時,規定葉節點分裂時將右子節點之第一個鍵值提升至父節點,內部節點分裂時則將中間鍵值提升至父節點。請完成下列各題:

(一) 依序插入 17、5、12、23、7、19、3、30 等 8 個鍵值以建構 B+-tree。

請逐步說明並繪製每次插入後之樹形結構。(12 分)

(二) 承接(一)之結果,依序刪除 7、23 與 5 等三個鍵值。刪除過程中若需借值時,一律自右兄弟節點借取;若無法借值,則與左兄弟節點合併。

請逐步說明並繪製每次刪除鍵值後之樹形結構。(6 分)

(三) 承接(一)之結果,說明在該 B+-tree 中搜尋鍵值 19 之完整過程,並列出查找時經過之節點及比較順序。(4 分)

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

這一題的完整詳解

核心觀念

本題考查 B+-tree 的插入、溢位分裂、刪除後的再平衡,以及依分隔鍵逐層搜尋。

  • 葉節點最多存放 22 個鍵值,至少存放 11 個鍵值。葉節點溢位時,將鍵值由小到大分成左右兩個葉節點,並把右葉節點的第一個鍵值複製到父節點作為分隔鍵;該鍵值仍保留在葉節點。
  • 內部節點最多有 33 個子節點、至少有 22 個子節點。內部節點溢位時,將中間鍵值提升至父節點;左右兩側的鍵值與子節點分別留在分裂後的左右節點。
  • B+-tree 的資料鍵值都存放於葉節點;內部節點的鍵值用來指引搜尋。
  • 刪除後,若節點低於最低容量,先依題目規定自右兄弟借值;右兄弟不能提供時,與左兄弟合併,並同步更新父節點分隔鍵。

以下以方括號表示葉節點,以圓括號表示內部節點;例如 [5,12][5,12] 是葉節點,(12)(12) 是含有分隔鍵 1212 的內部節點。

(一)依序插入 8 個鍵值

插入 17

根節點同時也是葉節點:

[17]

插入 5

[5,17]

插入 12

排序後成為 [5,12,17][5,12,17],超過葉節點容量 22。分成 [5][5] 與 [12,17][12,17],將右葉節點第一個鍵值 1212 複製到父節點,形成新根:

 (12)
 / \
 [5] [12,17]

插入 23

23≥1223 \ge 12,進入右葉節點,該葉節點成為 [12,17,23][12,17,23],再分成 [12][12] 與 [17,23][17,23];將 1717 複製至父節點:

 (12,17)
 / | \
 [5] [12] [17,23]

插入 7

7<127 < 12,插入最左葉節點:

 (12,17)
 / | \
 [5,7] [12] [17,23]

插入 19

19≥1719 \ge 17,插入最右葉節點。該葉節點成為 [17,19,23][17,19,23],分裂為 [17][17] 與 [19,23][19,23],將 1919 複製到父節點。父節點原有兩個鍵值,加入後成為 (12,17,19)(12,17,19),有四個子節點,超過內部節點最多 33 個子節點的限制。

內部節點分裂時提升中間鍵值 1717,左右兩側分別保留分隔鍵 1212 與 1919:

 (17)
 / \
 (12) (19)
 / \ / \
 [5,7] [12] [17] [19,23]

插入 3

3<173 < 17,再依左側內部節點的分隔鍵 1212 導向 [5,7][5,7]。插入後成為 [3,5,7][3,5,7],分裂為 [3][3] 與 [5,7][5,7],將右葉節點第一個鍵值 55 複製至父節點:

 (17)
 / \
 (5,12) (19)
 / | \ / \
 [3] [5,7] [12] [17] [19,23]

插入 30

30≥1730 \ge 17,導向右側內部節點 (19)(19),再進入右葉節點 [19,23][19,23]。插入後成為 [19,23,30][19,23,30],分裂為 [19][19] 與 [23,30][23,30],將 2323 複製至父節點:

 (17)
 / \
 (5,12) (19,23)
 / | \ / | \
 [3] [5,7] [12][17] [19] [23,30]

這是第(一)小題完成後的 B+-tree。

🔒

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

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

免費註冊

第 三 題24 分

已知待排序數列如下:

36, 45, 59, 81, 72, 64, 36‾, 2736,\ 45,\ 59,\ 81,\ 72,\ 64,\ \underline{36},\ 27

其中兩個 36 的數值相同,但以底線標示其中一個 36,以便在排序過程中追蹤其相對次序。

請完成下列各題:

(一) 說明何謂穩定排序(Stable Sort),並解釋若演算法不屬於穩定排序,在處理相同鍵值時會造成什麼影響。(6 分)

(二) 使用選擇排序(Selection Sort)對上述數列進行排序,並逐步描述每次選擇與交換的過程,最後給出排序後的結果。(6 分)

(三) 使用合併排序(Merge Sort)對上述數列進行排序,並描述拆分與合併的過程,最後給出排序後的結果。(6 分)

(四) 使用基數排序(Radix Sort)對上述數列進行排序,並描述逐位(個位數、十位數)的桶排序(Bucket Sort)過程,最後給出排序後的結果。(6 分)

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

這一題的完整詳解

核心觀念

本題考查穩定排序的定義,以及選擇排序、合併排序、基數排序的操作方式。排序鍵值相同時,以底線標示的 3636 記為 36‾\underline{36},未標示者記為 3636,藉此追蹤兩者的相對次序。

穩定排序(Stable Sort):若兩筆資料的鍵值相同,排序後仍保留它們在原始數列中的先後次序。本題原始次序是 3636 在 36‾\underline{36} 之前;穩定排序後也必須維持此順序。若排序演算法不穩定,相同鍵值的資料可能交換相對位置;當資料還帶有其他欄位時,即使主鍵相同,這些欄位的先後關係也可能改變。

解題方法

(一)穩定性說明(6 分)

穩定性只比較鍵值相同的資料:若排序前 AA 在 BB 之前,且兩者鍵值相同,排序後仍讓 AA 在 BB 之前,則此排序為穩定排序。

本題可用兩個 3636 驗證:穩定排序須保留 36, 36‾36,\ \underline{36} 的次序;若排序後變成 36‾, 36\underline{36},\ 36,即表示相對次序改變,該次排序不穩定。

(二)選擇排序(6 分)

每一趟從尚未排序的部分找出最小值,與該部分的第一個元素交換。以下採用標準的「交換式選擇排序」。

初始數列:

36, 45, 59, 81, 72, 64, 36‾, 2736,\ 45,\ 59,\ 81,\ 72,\ 64,\ \underline{36},\ 27
趟數未排序部分的最小值交換後數列
第 1 趟272727, 45, 59, 81, 72, 64, 36‾, 3627,\ 45,\ 59,\ 81,\ 72,\ 64,\ \underline{36},\ 36
第 2 趟363627, 36, 59, 81, 72, 64, 36‾, 4527,\ 36,\ 59,\ 81,\ 72,\ 64,\ \underline{36},\ 45
第 3 趟36‾\underline{36}27, 36, 36‾, 81, 72, 64, 59, 4527,\ 36,\ \underline{36},\ 81,\ 72,\ 64,\ 59,\ 45
第 4 趟454527, 36, 36‾, 45, 72, 64, 59, 8127,\ 36,\ \underline{36},\ 45,\ 72,\ 64,\ 59,\ 81
第 5 趟595927, 36, 36‾, 45, 59, 64, 72, 8127,\ 36,\ \underline{36},\ 45,\ 59,\ 64,\ 72,\ 81
第 6 趟646427, 36, 36‾, 45, 59, 64, 72, 8127,\ 36,\ \underline{36},\ 45,\ 59,\ 64,\ 72,\ 81
第 7 趟727227, 36, 36‾, 45, 59, 64, 72, 8127,\ 36,\ \underline{36},\ 45,\ 59,\ 64,\ 72,\ 81

第 2 趟把位置 2 的 4545 與位置 8 的 3636 交換,原本位於 4545 後方的 36‾\underline{36} 因此移到未標示的 3636 前面。這說明標準選擇排序不具穩定性。

(三)合併排序(6 分)

合併排序先遞迴拆分,再將已排序的小數列合併。合併時遇到相同鍵值,若優先取左半部的元素,便能保留原始相同鍵值元素的先後次序。

拆分:

[36,45,59,81,72,64,36‾,27][36,45,59,81,72,64,\underline{36},27] →[36,45,59,81]∣[72,64,36‾,27]\to [36,45,59,81]\quad|\quad[72,64,\underline{36},27] →[36,45]∣[59,81]∣[72,64]∣[36‾,27]\to [36,45]\quad|\quad[59,81]\quad|\quad[72,64]\quad|\quad[\underline{36},27]
🔒

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

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

免費註冊

第 四 題16 分

19 世紀電報傳輸以訊號數計費。為了降低成本,電報公司決定採用霍夫曼編碼(Huffman Coding)壓縮電文。

假設要傳輸字母 TURING,其出現次數如下:

TT(15 次)、UU(7 次)、RR(6 次)、II(6 次)、NN(5 次)、GG(5 次)。

在建構過程中,每次取出權重最小的兩個節點合併;若兩者權重相同,則依字母順序決定先後。請完成下列各題:

(一) 依步驟建構霍夫曼樹,並寫出各字母的編碼。(10 分)

(二) 比較固定長度編碼(假設每個字母以 3 位元表示)與霍夫曼編碼,並計算壓縮率(需列計算過程)。(6 分)

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

這一題的完整詳解

核心觀念

霍夫曼編碼(Huffman Coding)是依符號出現頻率建立最佳前綴碼的方法。建樹時反覆取出權重最小的兩個節點合併,新節點的權重為兩者相加,直到只剩一個根節點。將每個節點的左分支標為 00、右分支標為 11,從根走到葉節點的位元序列就是該字母的編碼。

本題指定權重相同時依字母順序決定先後,因此也需為合併後的內部節點指定排序標籤:以該子樹所含字母中排序最前者作為標籤。

解題方法

先將字母按權重由小到大排列:

N(5)、G(5)、I(6)、R(6)、U(7)、T(15)N(5)、G(5)、I(6)、R(6)、U(7)、T(15)

依規則每次合併最小的兩個節點:

步驟取出的節點合併結果
1G(5)、N(5)G(5)、N(5)GN(10)GN(10)
2I(6)、R(6)I(6)、R(6)IR(12)IR(12)
3U(7)、GN(10)U(7)、GN(10)UGN(17)UGN(17)
4IR(12)、T(15)IR(12)、T(15)IRT(27)IRT(27)
5UGN(17)、IRT(27)UGN(17)、IRT(27)根節點 (44)(44)

第 1 步的 GG、NN 權重相同,按字母順序先取 GG;第 2 步的 II、RR 同理先取 II。之後每一步都是取當下權重最小的兩個節點。

依合併順序建立樹,左右分支由左至右分別標記 00、11:

 (44)
 / \
 (17) (27)
 / \ / \
 U(7) (10) (12) T(15)
 / \ / \
 G(5) N(5) I(6) R(6)

由根節點往下讀取分支標記,可得:

字母霍夫曼編碼碼長
TT11112
UU00002
RR1011013
II1001003
NN0110113
GG0100103
🔒

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

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

免費註冊

第 五 題16 分

下圖為一有向圖(Directed Graph)GG。請完成下列各題:

(一) 畫出圖 GG 的相鄰串列(Adjacency List)。(4 分)

(二) 畫出圖 GG 的相鄰矩陣(Adjacency Matrix)。(4 分)

(三) 從節點 aa 開始,寫出廣度優先搜尋(Breadth-First Search, BFS)的節點拜訪順序。(4 分)

(四) 從節點 aa 開始,寫出深度優先搜尋(Depth-First Search, DFS)的節點拜訪順序。(4 分)

🖼️ 本題原卷含圖表。基於試題來源之版權考量,本站不轉載原卷影像; 題目文字已完整轉錄,圖表請自行參閱考選部公告之試題原檔。

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

這一題的完整詳解

核心觀念

有向圖的相鄰串列記錄每個頂點沿箭頭方向可到達的頂點;相鄰矩陣以列表示起點、欄表示終點,若有邊則記為 11,沒有則記為 00。

BFS 使用佇列,依層次拜訪;DFS 沿著尚未拜訪的鄰點繼續深入,再回溯。題目沒有指定同一頂點的鄰點處理順序,因此以下採頂點字母順序處理,亦即 a,b,c,d,e,fa,b,c,d,e,f。

解題方法

依圖中箭頭可整理出邊:

a→b, a→d, a→f,b→a, b→c, b→d,c→e, c→f,d→c, d→e,f→ea\to b,\ a\to d,\ a\to f,\quad b\to a,\ b\to c,\ b\to d,\quad c\to e,\ c\to f,\quad d\to c,\ d\to e,\quad f\to e

(一)相鄰串列

按字母順序列出各頂點的出邊:

  • a: b,d,fa:\ b,d,f
  • b: a,c,db:\ a,c,d
  • c: e,fc:\ e,f
  • d: c,ed:\ c,e
  • e: ∅e:\ \varnothing
  • f: ef:\ e

(二)相鄰矩陣

列為起點、欄為終點,頂點順序皆為 a,b,c,d,e,fa,b,c,d,e,f:

🔒

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

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

免費註冊

其他考古題