109 地方特考三等 資訊處理 資料結構 考古題詳解
第 一、 題10 分
請設計演算法複製一棵二元樹(copy a binary tree)。
登入後即可作答並保存紀錄。
核心觀念
本題評量二元樹(Binary Tree)的動態走訪與深層複製(Deep Copy)演算法設計。
- 深層複製(Deep Copy) vs. 淺層複製(Shallow Copy):
- 淺層複製僅複製根節點的指標位址,會使新舊指標指向同一塊記憶體位址,造成別名效應(Aliasing)與重複釋放(Double Free)風險。
- 複製整棵二元樹必須進行「深層複製」,為新樹的每個節點獨立配置記憶體空間(Dynamic Memory Allocation),並遞迴複製原樹各節點的數值與結構鏈結。
- 走訪策略(Tree Traversal):
- 樹狀結構具備高度自相似性(Self-similarity),天然適合採用**分治法(Divide and Conquer)與遞迴(Recursion)**實現。
- 複製二元樹通常採用**前序走訪(Preorder Traversal)或後序走訪(Postorder Traversal)**概念:先配置新節點並複製資料,再遞迴複製左、右子樹;或先複製完左右子樹後,再連結至新建立的根節點。
解題方法
1. 資料結構定義
在實作演算法前,先定義標準的二元樹鏈結串列結構(以 C 語言為例):
typedef struct TreeNode {
int data; // 節點儲存資料
struct TreeNode *left; // 指向左子樹的指標
struct TreeNode *right; // 指向右子樹的指標
} TreeNode;
2. 演算法邏輯推導
設函式為 CopyTree(root),輸入為原二元樹的根節點指標 root,回傳值為新複製二元樹的根節點指標:
- 基本終止條件(Base Case):若輸入節點為空(
root == NULL),表示當前子樹為空,直接回傳NULL。 - 遞迴步驟(Recursive Step):
- 使用動態記憶體配置(如
malloc)產生一個新的節點空間newNode。 - 複製資料:將原節點的資料複製給新節點(
newNode->data = root->data)。 - 複製左子樹:遞迴呼叫
CopyTree(root->left),並將回傳之新左子樹根指標賦予newNode->left。 - 複製右子樹:遞迴呼叫
CopyTree(root->right),並將回傳之新右子樹根指標賦予newNode->right。 - 回傳當前新建立的節點指標
newNode。
3. 演算法程式碼(C 語言實作)
第 二、 題20 分
(一)請描述 order 為 的 B-tree 之特性。(6 分)
(二)請問 order 為 、高度為 的 B-tree:
- 最多有幾個節點?最多有幾個 Key?(6 分)
- 最少有幾個節點?最少有幾個 Key?(8 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查高階樹狀資料結構中 B-tree(B-樹,平衡多元搜尋樹) 的基本定義與極值推導。核心考點包含:
- 階數(Order )的意義:決定了節點最多可擁有的子樹(分支)數目與鍵值(Key)數目上限。
- 分支數與鍵值數的關係:若一個節點擁有 個分支,則該節點內部必恰好包含 個鍵值。
- 內部節點與根節點(Root)的下限限制:
- 令 。
- 非根節點之分支數至少為 ,即鍵值數至少為 。
- 根節點為特例:當樹高 時,根節點之分支數最少僅需為 ,即鍵值數最少為 。
- 樹高(Height )與層數(Level)的約定: 本題採國內資訊處理類科公職考試及權威教本(如 Horowitz 等)最主流之標準定義——根節點位於第 層,整棵樹共有 層節點,葉節點位於第 層進行推導。
解題方法
(一)Order 為 的 B-tree 之特性(6 分)
一棵 order 為 的 B-tree,必須嚴格滿足以下五項結構與排序特性:
- 子節點數上限:樹中任一節點最多擁有 個子節點(即最多包含 個鍵值)。
- 根節點特例:若根節點不是葉節點,則根節點至少擁有 個子節點(至少包含 個鍵值)。若整棵樹只有根節點(),則至少包含 個鍵值。
- 非根節點的子節點數下限:除根節點外,所有非葉節點至少擁有 個子節點(即至少包含 個鍵值)。
- 葉節點等高平衡性:所有外部葉節點(Leaf nodes)皆位於同一深度(同一層),保證樹結構具備完美的平衡性。
- 多元搜尋排序性:節點內的鍵值依序由小到大排列;若一節點具有 個子節點,則該節點包含 個鍵值 ,並將子樹範圍劃分為 個有序區間,使得介於 與 之間的分支子樹所有鍵值皆落在此開區間內。
(二)Order 為 、高度為 的極值推導
令 。
1. 最多有幾個節點?最多有幾個 Key?(6 分)
-
推導切入點: 若要使節點數與鍵值數達到最大值,則每個節點的分支數皆必須取上限 ,且每個節點的鍵值數皆必須取上限 。
-
最多節點數()推導: 各層節點數呈公比為 的等比數列:
-
第 層(根節點): 個節點
-
第 層: 個節點
-
第 層: 個節點
-
-
第 層: 個節點
-
第 層: 個節點
總節點數為各層總和(等比級數求和):
- 最多鍵值數()推導: 由於每個節點皆填滿 個鍵值,總鍵值數為節點總數乘上 :
2. 最少有幾個節點?最少有幾個 Key?(8 分)
-
推導切入點: 若要使節點數與鍵值數達到最小值,則各節點的分支數與鍵值數皆必須取下限:
-
根節點的分支數取下限 ,鍵值數取下限 。
-
其餘各層內部節點的分支數皆取下限 ,鍵值數皆取下限 。
-
最少節點數()推導:
-
當 時:整棵樹僅有根節點,。
-
當 時,分析各層節點數:
-
第 層(根節點): 個節點
-
第 層:根節點僅有 個分支 個節點
-
第 層:第 層的每個節點各有 個分支 個節點
-
-
第 層(): 個節點
第 三、 題14 分
請利用 Double Hashing 將下列 key 值放入 hash table of size 13 中:
表 1:
索引:
內容:、、、、、、、、、、、、____
登入後即可作答並保存紀錄。
核心觀念
Double Hashing(雙重雜湊)處理碰撞時,使用第二個雜湊函數決定每次探查的步長。第 次探查的位置為:
其中 從 開始;若 ,就是先檢查初始位置 。依題目給定的 key 順序逐一插入,遇到已占用的位置就依探查序列繼續尋找空格。
解題方法
依序計算每個 key 的初始位置與步長:
- :,。索引 空,放入 。
- :,。索引 空,放入 。
- :,。索引 空,放入 。
- :,。索引 空,放入 。
- :,。索引 已有 ;下一個位置為 ,放入索引 。
第 四、 題24 分
(一)在一棵高度為 ()的 AVL tree 中:
- 高度為 6 之 AVL tree 最多可能有幾個 nodes?最少可能有幾個 nodes?(假設 root 之 )(6 分)
- 假設此樹共有 45 個 nodes。請問此 AVL tree 可能最高之高度及最矮之高度各為何?(6 分)
(二)請將下列數字 逐步插入圖 1 的 AVL tree 中,並平衡之。(12 分)
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
AVL tree 是每個節點左右子樹高度差不超過 的二元搜尋樹。題目以 root 高度為 ,因此空子樹高度為 、葉節點高度為 。
高度固定為 時:
- 節點數最多:左右子樹都填滿,。
- 節點數最少:左右子樹高度取 與 ,所以 其中 、。
插入節點時,先依二元搜尋樹規則放到葉節點,再由下往上檢查平衡;失衡時依插入方向採用 LL、RR、LR 或 RL 旋轉。
(一)解題方法與計算
- 高度為 的 AVL tree:
最多節點數為
最少節點數依遞迴式計算:
因此,高度為 時最多有 個節點,最少有 個節點。
- 樹共有 個節點:
要讓高度最高,找出仍能容納 個節點的最大高度。由遞迴式得 、,因此高度 可容納 個節點,高度 至少需要 個節點。最高高度為 。
要讓高度最矮,找出最大節點數首次達到 的高度: 最矮高度為 。
(二)逐步插入與平衡
以下以 表示節點 ,其左、右子樹分別為 、; 表示空子樹。原樹為:
第 五、 題10 分
請利用堆積排序法(Heap Sort)將圖 2 逐步建立成 Min Heap,並將數字從小到大逐一列舉。(10 分)
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
將圖 2 的二元樹依「由上到下、由左到右」轉成陣列,再用由下而上的堆積化建立 Min Heap。Min Heap 的定義是:每個父節點的值都小於或等於其子節點,因此根節點是目前最小值。
建立 Min Heap 後,每次取出根節點,將最後一個元素移到根部,再向下調整堆積。依序取出的值便是由小到大的排列。
解題方法
圖中的層序陣列為:
採用 0 起始索引,從最後一個非葉節點開始向前堆積化。陣列長度為 9,最後一個非葉節點索引為 。
| 堆積化索引 | 調整方式 | 調整後陣列 |
|---|---|---|
| 3 | 12 與較小子節點 5 交換 | |
| 2 | 20 與較小子節點 17 交換 | |
| 1 | 14 與 5 交換,再將 14 與 8 交換 |
第 六、 題22 分
(一)請利用 KMP(Knuth, Morris, Pratt)演算法寫出失敗函數(failure function)之定義。(4 分)
(二)找出 pattern「abcdabcabcdabcdabc」之失敗函數(failure function)值,請填入表 2 failure value 中。(14 分)
(三)假設(二)之 pattern 嘗試在 string「abcdabcabcdabcabcda....」找出 pattern。當 pattern 從 index 0 開始比對到 index 13 都一樣,而在 index 14 時發現字母不一樣,請問 pattern 如何利用 failure function 所得之結果很快找到下一個要對應之位置?也就是 pattern 的那一位置的值要位移到 string 的那一對應位置。(4 分)
表 2:
index:
string:
pattern:
failure value:
登入後即可作答並保存紀錄。
核心觀念
KMP 的失敗函數記錄:對 pattern 的每個位置 ,子字串 中,最長的「真前綴」同時也是「真後綴」的長度。此處採用長度表示法,因此 。
當比對到位置 失敗時,利用已比對部分的失敗函數值,保留可重用的前綴比對結果,避免 string 指標回頭。
解題方法
題目的 pattern 長度為 ,位置 到 的字元依序為:
| index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| pattern | a | b | c | d | a | b | c | a | b | c | d | a | b | c | d | a | b | c |
| failure value | 0 | 0 | 0 | 0 | 1 | 2 | 3 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 4 | 5 | 6 | 7 |
例如:
- 時,,最長相同真前綴與真後綴為 ,故 。
- 時,,最長相同真前綴與真後綴為 ,故 。