112 公務人員升官等薦任 資訊處理 資料結構 考古題詳解
第 一 題15 分
假設有一宣告為 的浮點數陣列(假設 )。
(每小題 5 分,共 15 分)
(一)此陣列共占多少位元組(Bytes)?
(二)若 在記憶體的位址為 ,則元素 的位址為何?
(三)若 在記憶體的位址為 ,則元素 的位址為何?
登入後即可作答並保存紀錄。
核心觀念
二維陣列的元素位址,取決於陣列在記憶體中的儲存順序。本題依一般程式語言的 row-major(列優先) 方式計算:同一列的元素依欄索引連續存放,再依列索引排列。
每個元素占 Bytes,陣列有 列、每列 個元素,因此:
其中 是 的位址。若已知其他元素的位址,也可先求出兩元素間的索引差,再換算成位元組差。
解題方法
(一)計算陣列所占空間
陣列共有 個元素,每個元素占 Bytes:
(二)由 求 的位址
從 到 ,跨過 列,每列 個元素,再往右移 個元素,因此索引差為:
位移量為:
第 二 題10 分
(一)請將下列表形式轉成後序(Postfix)。(5 分)
(二)請將下列表形式轉成中序(Infix)。(5 分)
登入後即可作答並保存紀錄。
核心觀念
- 前序、中序、後序是運算式的三種表示法:運算子分別置於運算元之前、中間或之後。後序式不需括號即可依運算順序計算。
- 中序轉後序時,依運算子優先順序安排輸出;括號內先處理,指數運算優先於乘除,乘除優先於加減。
- 後序轉中序時,從左至右掃描:運算元推入堆疊;遇到二元運算子,依序取出右運算式與左運算式,組成「(左運算式 運算子 右運算式)」後推回堆疊。
(一)中序轉後序
原式為:
依括號與運算子優先順序分段轉換:
- 轉為 。
- 轉為 ;再與 組成 ,其後序式為 CDE-^。
- 轉為 。
- 將前述兩個括號相乘,得到 。
- 最後減去 ,在式尾加入 。
因此,後序式為:
(二)後序轉中序
將原式逐段依後序運算規則組合。每遇到運算子,就把堆疊頂端的兩個運算式取出,先取出的作為右運算式,後取出的作為左運算式。
| 後序片段 | 組合結果 |
|---|---|
AB+ | |
AB+D* | |
BA/ | |
EBA// | |
AB+D*EBA//+ | |
AD*C/ |
第 三 題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
第 四 題20 分
若將下圖當作樹,請分別用陣列與鏈結串列(Linked List)的方式來表示。
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
二元樹可用兩種方式表示:
- 陣列表示法:採用根節點索引為 的慣例。索引為 的節點,其左子節點位於 ,右子節點位於 。
- 鏈結串列表示法:每個節點包含資料欄位,以及指向左子節點、右子節點的指標;沒有子節點時,指標為
NULL。
解題方法
由圖可讀出: 是根節點; 的左、右子節點分別為 、; 的左子節點為 ; 的左子節點為 ; 的右子節點為 。
依陣列表示法逐層定位:
- 節點 在索引 。
- 節點 、 分別在索引 、。
- 節點 是節點 的左子節點,位於索引 。
- 節點 是節點 的左子節點,位於索引 。
- 節點 是節點 的右子節點,位於索引 。
陣列表示法
第 五 題15 分
請使用 Prim 演算法找出下圖的最小生成樹(Minimum Spanning Tree),起始點為節點 ,請將搜尋結果畫出來。
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
Prim 演算法從指定起點逐步擴張生成樹。每一步都從「已納入生成樹的節點」連到「尚未納入的節點」的邊中,選擇權重最小者;如此直到所有節點都納入。若圖有 個節點,最小生成樹會有 條邊。
解題方法
從起點 開始,每一步列出連接樹內與樹外節點的候選邊,選取權重最小者:
| 步驟 | 已納入節點 | 選取的邊 | 權重 |
|---|---|---|---|
| 起始 | — | — | |
| 1 | 2 | ||
| 2 | 2 | ||
| 3 | 3 | ||
| 4 | 4 | ||
| 5 | 4 |
第 六 題20 分
假定一個整數序列:
請使用合併排序(Merge Sort)從小到大進行排序及整理,並且一步一步寫出過程。
登入後即可作答並保存紀錄。
核心觀念
合併排序(Merge Sort)採用「分而治之」:
- 將序列反覆切成左右兩半,直到每個子序列只剩一個元素。
- 單一元素視為已排序。
- 逐層合併相鄰的已排序子序列;每次比較兩邊目前最前面的元素,將較小者放入結果序列,直到合併完成。
本題共有 個元素,可連續對半切分為 個元素的區段,再逐層合併回完整序列。
解題方法
一、分割序列
原始序列:
第一層分成左右兩半:
第二層各自再分成兩半:
第三層繼續分割,直到每組只剩兩個元素:
二、由小組開始合併
先將每組兩個元素排成遞增順序:
合併相鄰兩組。例如,合併 與 :依序比較兩組最前端元素,取出 ,得到 。其餘各組同理: