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

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

第 一 題15 分

假設有一宣告為 float A[18][10]float\ A[18][10] 的浮點數陣列(假設 sizeof⁡(float)=4 Bytes\operatorname{sizeof}(\text{float})=4\ \text{Bytes})。

(每小題 5 分,共 15 分)

(一)此陣列共占多少位元組(Bytes)?

(二)若 A[0][0]A[0][0] 在記憶體的位址為 (03C4)16(03C4)_{16},則元素 A[5][3]A[5][3] 的位址為何?

(三)若 A[16][2]A[16][2] 在記憶體的位址為 (10E9)16(10E9)_{16},則元素 A[5][3]A[5][3] 的位址為何?

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

這一題的完整詳解

核心觀念

二維陣列的元素位址,取決於陣列在記憶體中的儲存順序。本題依一般程式語言的 row-major(列優先) 方式計算:同一列的元素依欄索引連續存放,再依列索引排列。

每個元素占 44 Bytes,陣列有 1818 列、每列 1010 個元素,因此:

位址⁡(A[i][j])=Base⁡+(i×10+j)×4\operatorname{位址}(A[i][j]) = \operatorname{Base} + \bigl(i\times 10+j\bigr)\times 4

其中 Base⁡\operatorname{Base} 是 A[0][0]A[0][0] 的位址。若已知其他元素的位址,也可先求出兩元素間的索引差,再換算成位元組差。

解題方法

(一)計算陣列所占空間

陣列共有 18×10=18018\times 10=180 個元素,每個元素占 44 Bytes:

18×10×4=720 Bytes18\times 10\times 4=720\text{ Bytes}

(二)由 A[0][0]A[0][0] 求 A[5][3]A[5][3] 的位址

從 A[0][0]A[0][0] 到 A[5][3]A[5][3],跨過 55 列,每列 1010 個元素,再往右移 33 個元素,因此索引差為:

5×10+3=53 個元素5\times 10+3=53\text{ 個元素}

位移量為:

53×4=212 Bytes=(D4)1653\times 4=212\text{ Bytes}=(\text{D4})_{16}
🔒

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

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

免費註冊

第 二 題10 分

(一)請將下列表形式轉成後序(Postfix)。(5 分)

(A+B)×(C(D−E)+F)−G(A+B)\times(C^{(D-E)}+F)-G

(二)請將下列表形式轉成中序(Infix)。(5 分)

AB+D∗EBA//+AD∗C/+CD∗+A−B+CD∗−AB+D*EBA//+AD*C/+CD*+A-B+CD*-

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

這一題的完整詳解

核心觀念

  • 前序、中序、後序是運算式的三種表示法:運算子分別置於運算元之前、中間或之後。後序式不需括號即可依運算順序計算。
  • 中序轉後序時,依運算子優先順序安排輸出;括號內先處理,指數運算優先於乘除,乘除優先於加減。
  • 後序轉中序時,從左至右掃描:運算元推入堆疊;遇到二元運算子,依序取出右運算式與左運算式,組成「(左運算式 運算子 右運算式)」後推回堆疊。

(一)中序轉後序

原式為:

(A+B)×(C(D−E)+F)−G(A+B)\times(C^{(D-E)}+F)-G

依括號與運算子優先順序分段轉換:

  1. (A+B)(A+B) 轉為 AB+AB+。
  2. (D−E)(D-E) 轉為 DE−DE-;再與 CC 組成 C(D−E)C^{(D-E)},其後序式為 CDE-^。
  3. C(D−E)+FC^{(D-E)}+F 轉為 CDE−F+CDE-^F+。
  4. 將前述兩個括號相乘,得到 AB+CDE−F+∗AB+CDE-^F+*。
  5. 最後減去 GG,在式尾加入 G−G-。

因此,後序式為:

AB+CDE−F+∗G−\boxed{AB+CDE-^F+*G-}

(二)後序轉中序

將原式逐段依後序運算規則組合。每遇到運算子,就把堆疊頂端的兩個運算式取出,先取出的作為右運算式,後取出的作為左運算式。

後序片段組合結果
AB+(A+B)(A+B)
AB+D*((A+B)∗D)((A+B)*D)
BA/(B/A)(B/A)
EBA//(E/(B/A))(E/(B/A))
AB+D*EBA//+(((A+B)∗D)+(E/(B/A)))(((A+B)*D)+(E/(B/A)))
AD*C/((A∗D)/C)((A*D)/C)
🔒

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

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

免費註冊

第 三 題20 分

下圖為一棵二元搜尋樹(Binary Search Tree)。若要刪除節點 48,在維持最小變動的狀況下,但仍需維持一棵二元搜尋樹,請畫出所有可能的二元搜尋樹。

🖼️【此處有附圖,請對照原卷】

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

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

這一題的完整詳解

核心觀念

二元搜尋樹(Binary Search Tree, BST)符合以下規則:每個節點的左子樹鍵值都小於該節點,右子樹鍵值都大於該節點。

刪除只有一個或沒有子節點的節點時,可以直接接回其子樹;刪除有兩個子節點的節點時,為了維持 BST,通常以其中序前驅或中序後繼取代:

  • 中序前驅:左子樹中的最大值。
  • 中序後繼:右子樹中的最小值。

題目要求「維持最小變動」,因此取代 48 後,只需再刪除該前驅或後繼原本的位置。

解題方法

原樹中,48 的左子樹最大值為 45,右子樹最小值為 55,所以有兩種取代方式。

方法一:以中序前驅 45 取代 48

45 原本是 41 的右子節點,刪除 45 後,將 45 放到根節點位置;其餘節點連結維持不變。

 45
 / \
 37 77
 \ /
 41 66
 / / \
 38 55 70
 \
 40
🔒

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

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

免費註冊

第 四 題20 分

若將下圖當作樹,請分別用陣列與鏈結串列(Linked List)的方式來表示。

🖼️【此處有附圖,請對照原卷】

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

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

這一題的完整詳解

核心觀念

二元樹可用兩種方式表示:

  • 陣列表示法:採用根節點索引為 11 的慣例。索引為 ii 的節點,其左子節點位於 2i2i,右子節點位於 2i+12i+1。
  • 鏈結串列表示法:每個節點包含資料欄位,以及指向左子節點、右子節點的指標;沒有子節點時,指標為 NULL。

解題方法

由圖可讀出:11 是根節點;11 的左、右子節點分別為 22、33;22 的左子節點為 44;44 的左子節點為 66;33 的右子節點為 55。

依陣列表示法逐層定位:

  • 節點 11 在索引 11。
  • 節點 22、33 分別在索引 22、33。
  • 節點 44 是節點 22 的左子節點,位於索引 2×2=42 \times 2=4。
  • 節點 66 是節點 44 的左子節點,位於索引 2×4=82 \times 4=8。
  • 節點 55 是節點 33 的右子節點,位於索引 2×3+1=72 \times 3+1=7。

陣列表示法

🔒

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

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

免費註冊

第 五 題15 分

請使用 Prim 演算法找出下圖的最小生成樹(Minimum Spanning Tree),起始點為節點 aa,請將搜尋結果畫出來。

🖼️【此處有附圖,請對照原卷】

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

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

這一題的完整詳解

核心觀念

Prim 演算法從指定起點逐步擴張生成樹。每一步都從「已納入生成樹的節點」連到「尚未納入的節點」的邊中,選擇權重最小者;如此直到所有節點都納入。若圖有 nn 個節點,最小生成樹會有 n−1n-1 條邊。

解題方法

從起點 aa 開始,每一步列出連接樹內與樹外節點的候選邊,選取權重最小者:

步驟已納入節點選取的邊權重
起始{a}\{a\}——
1{a,c}\{a,c\}a−ca-c2
2{a,c,b}\{a,c,b\}c−bc-b2
3{a,c,b,f}\{a,c,b,f\}c−fc-f3
4{a,c,b,f,d}\{a,c,b,f,d\}b−db-d4
5{a,c,b,f,d,e}\{a,c,b,f,d,e\}b−eb-e4
🔒

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

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

免費註冊

第 六 題20 分

假定一個整數序列:

3, 12, 11, 13, 10, 8, 1, 4, 9, 15, 2, 6, 7, 14, 5, 163,\ 12,\ 11,\ 13,\ 10,\ 8,\ 1,\ 4,\ 9,\ 15,\ 2,\ 6,\ 7,\ 14,\ 5,\ 16

請使用合併排序(Merge Sort)從小到大進行排序及整理,並且一步一步寫出過程。

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

這一題的完整詳解

核心觀念

合併排序(Merge Sort)採用「分而治之」:

  1. 將序列反覆切成左右兩半,直到每個子序列只剩一個元素。
  2. 單一元素視為已排序。
  3. 逐層合併相鄰的已排序子序列;每次比較兩邊目前最前面的元素,將較小者放入結果序列,直到合併完成。

本題共有 1616 個元素,可連續對半切分為 8、4、2、18、4、2、1 個元素的區段,再逐層合併回完整序列。

解題方法

一、分割序列

原始序列:

[3,12,11,13,10,8,1,4,9,15,2,6,7,14,5,16][3,12,11,13,10,8,1,4,9,15,2,6,7,14,5,16]

第一層分成左右兩半:

[3,12,11,13,10,8,1,4]∣[9,15,2,6,7,14,5,16][3,12,11,13,10,8,1,4] \quad|\quad [9,15,2,6,7,14,5,16]

第二層各自再分成兩半:

[3,12,11,13]∣[10,8,1,4]∣[9,15,2,6]∣[7,14,5,16][3,12,11,13]\quad|\quad[10,8,1,4] \quad|\quad [9,15,2,6]\quad|\quad[7,14,5,16]

第三層繼續分割,直到每組只剩兩個元素:

[3,12] [11,13] [10,8] [1,4] [9,15] [2,6] [7,14] [5,16][3,12]\ [11,13]\ [10,8]\ [1,4]\ [9,15]\ [2,6]\ [7,14]\ [5,16]

二、由小組開始合併

先將每組兩個元素排成遞增順序:

[3,12] [11,13] [8,10] [1,4] [9,15] [2,6] [7,14] [5,16][3,12]\ [11,13]\ [8,10]\ [1,4]\ [9,15]\ [2,6]\ [7,14]\ [5,16]

合併相鄰兩組。例如,合併 [3,12][3,12] 與 [11,13][11,13]:依序比較兩組最前端元素,取出 3、11、12、133、11、12、13,得到 [3,11,12,13][3,11,12,13]。其餘各組同理:

🔒

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

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

免費註冊

其他考古題