112 地方特考三等 資訊處理類科 資料結構 考古題詳解
第 一 題12 分
請以 C、C++、C#、Java 或 Python 撰寫 2 個方法,一個以迴圈方式、一個以遞迴方式,對存在於 singular linked list 的資料進行 linearly search。假設 Node 的結構如下:
class Node { int data=0; Node next=null; Node(int dd, Node nn) { data=dd; next=nn; } }
登入後即可作答並保存紀錄。
核心觀念
線性搜尋(linear search)是從單向鏈結串列的起點開始,依序比較每個節點的 data 與目標值。單向鏈結串列只能透過 next 前往下一個節點,因此最壞情況下須走訪整個串列。
以下方法在找到目標時回傳該節點;搜尋到串列尾端仍未找到時回傳 null。若有重複值,回傳從串列起點遇到的第一個符合節點。
解題方法
假設方法接收串列起點 head 與搜尋目標 target,且 head 為 null 代表空串列。
迴圈方式
static Node linearSearchIterative(Node head, int target) {
Node current = head;
while (current != null) {
if (current.data == target) {
return current;
}
current = current.next;
}
return null;
}
current 由 head 開始逐節點向後移動。每次先檢查目前節點;相符就回傳,否則移至 current.next。當 current == null 時,表示已走到串列尾端,整串串列都沒有目標值。
遞迴方式
第 二 題24 分
請為數列 建立 AVL tree、Min/Max heap、2-4 tree,並依它們的性質以 yes or no 完成下表。
註:所建立的 tree or heap 請以圖示。如果是 Searching Tree,請以左小右大的方式建立。
| Balance | Searching Tree | |
|---|---|---|
| AVL tree | ||
| Min heap | ||
| Max heap | ||
| 2-4 tree |
登入後即可作答並保存紀錄。
核心觀念
本題比較四種樹狀結構的兩項性質:
- Balance:樹高是否受到結構規則控制,使左右子樹高度大致平衡。
- Searching Tree:是否具有搜尋樹的順序性;本題採左小右大,且每個節點的子樹鍵值具有區間順序。
以下依數列順序逐筆插入建立;Heap 採一般逐筆插入並向上調整。
一、AVL tree
AVL tree 要求每個節點的平衡因子滿足:
依序插入時,主要旋轉如下:
- 插入 :形成 RR,對 左旋。
- 插入 :形成 RR,對 左旋。
- 插入 :形成 RR,對 左旋。
- 插入 :形成 LL,對 右旋。
最後的 AVL tree 為:
50
/ \
30 70
/ \ / \
10 40 60 80
/ \ \
0 20 90
AVL tree 經過旋轉維持高度平衡,因此 Balance = yes;同時符合左小右大的搜尋順序,因此 Searching Tree = yes。
二、Min heap
Min heap 必須滿足:
逐筆插入並向上調整後,陣列表示為:
其樹形如下:
0
/ \
10 30
/ \ / \
20 50 80 40
/ \ /
90 70 60
每個父節點均小於或等於子節點,符合 Min heap 定義。Heap 使用完全二元樹,因此具有結構上的平衡性,但節點並未依左小右大排列。
所以:
- Balance = yes
- Searching Tree = no
三、Max heap
Max heap 必須滿足:
逐筆插入並向上調整:
- 插入 後, 上移。
- 插入 後, 上移。
- 插入 後, 上移。
- 插入 時,分別依父子大小關係向上調整。
最後陣列表示為:
樹形如下:
90
/ \
70 80
/ \ / \
40 60 10 50
/ \ /
0 20 30
每個父節點均大於或等於子節點,符合 Max heap 定義。Heap 的完全二元樹結構具有平衡性,但不具左小右大的搜尋樹順序。
所以:
- Balance = yes
- Searching Tree = no
第 三 題10 分
請以如下的 Huffman Tree 所做的數字編碼,解讀 編碼對應的數字。
🖼️【此處有附圖,請對照原卷】
登入後即可作答並保存紀錄。
核心觀念
Huffman Tree 以「由根節點走到葉節點」的路徑作為數字編碼:
- 向左走記為
- 向右走記為
- 走到葉節點時,得到一個數字
- 依序切割編碼字串,直到全部讀完
依圖可得各數字編碼:
解題方法
將題目字串由左至右依照上述編碼切割:
切割結果為:
第 四 題24 分
針對如下的有向圖(節點為走訪對象,連線上的數字為走訪的 cost),依如下 BFS(配合 queue)與 DFS(配合 stack)演算法,進行所有節點的走訪。多個節點可以走訪時,以連線上 cost 較低者優先,結果請以迴圈內部的顯示要求,依下表形式填入。
註:假設節點 S 為起始點。
🖼️【此處有附圖,請對照原卷】
BFS 演算法的 queue 垂直表示,開口在上方;queue 水平表示,出口在左,入口在右。
| BFS 演算法 | Loop1 | … |
|---|---|---|
| print node | ||
| queue | ||
| processSet |
| DFS 演算法 | Loop1 | … |
|---|---|---|
| print node | ||
| Stack | ||
| processSet |
BFS/DFS 演算法(/前為 BFS 使用 queue,/後為 DFS 使用 stack):
Step1:set queue/stack to empty
set processSet to empty
Step2:enqueue/push S and add S into processSet
Step3:while queue/stack is not empty
Step31:dequeue/pop and print it
Step32:enqueue/push all one step neighbors which are not in processSet according to the cost of edges and add them into processSet
Step33:display content of queue/stack and processSet
登入後即可作答並保存紀錄。
核心觀念
本題考查:
- BFS 使用 queue,採先進先出(FIFO)。
- DFS 使用 stack,採後進先出(LIFO)。
processSet在節點加入 queue 或 stack 時立即記錄,避免同一節點重複加入。- 多個可走訪節點依邊的 cost 由小到大處理。
- BFS 的走訪順序受 queue 影響;DFS 的走訪順序受 stack 的「最後 push 者先 pop」影響。
依圖可讀得主要邊如下:
- 、、
- 、、
- 、、
以下集合內容依「加入順序」表示;queue 由左至右表示出口到入口,stack 由左至右表示 stack top 到 stack bottom。
解題方法
BFS
起點 先加入 queue 與 processSet。
- 從 可到 ,cost 依序為 ,因此加入順序為 。
- 從 可到 ,其中 已在
processSet,故依 cost 加入 。 - 之後依 queue 順序逐一取出節點。
| BFS 演算法 | Loop1 | Loop2 | Loop3 | Loop4 | Loop5 | Loop6 | Loop7 |
|---|---|---|---|---|---|---|---|
| print node | S | B | A | C | X | Y | Z |
| queue | B, A, C | A, C, X, Y | C, X, Y | X, Y, Z | Y, Z | Z | empty |
第 五 題30 分
請完成下列表格有關排序演算法的 time complexity(假設排序資料有 個,資料位數有 個)、是否為 In-Space 演算法、是否為 Stable 演算法及範例數列 進行降冪排列時所需的比較次數。
| 排序演算法 | Time Complexity Best | Time Complexity Worst | In-Space(Yes/No) | Stable(Yes/No) | 降冪比較次數 |
|---|---|---|---|---|---|
| Bubble | |||||
| Insertion | |||||
| Merge(奇數時,後半段多 1) | |||||
| Quick(第一個當 pivot) | |||||
| Radix(base 10) | |||||
| Selection |
登入後即可作答並保存紀錄。
核心觀念
本題考查各排序演算法的:
- 最佳與最差時間複雜度
- In-Space:是否只使用 額外空間
- Stable:相同鍵值的相對順序是否保持
- 對指定數列進行降冪排序時的比較次數
Radix Sort 不依賴元素彼此比較,因此比較次數為 。
以下採用一般教科書中的標準版本:
- Bubble Sort 使用提前結束判斷
- Merge Sort 合併時,兩邊皆有元素才進行比較
- Quick Sort 採第一個元素為 pivot,且每次 partition 對其餘元素各比較一次
解題方法
指定數列為:
此數列本身已經是降冪排列。
Bubble Sort
降冪排序時,第一輪檢查相鄰元素即可發現沒有任何交換,需比較:
最佳時間複雜度為 ,最差為 。Bubble Sort 僅交換相鄰元素,因此為 Stable,且為 In-Space。
Insertion Sort
數列已符合降冪順序,每個新元素只需與前一元素比較一次:
最佳時間複雜度為 ,最差為 。Insertion Sort 為 In-Space 且 Stable。
Merge Sort
依題意,奇數個元素時後半段多一個元素:
合併比較次數如下:
- 合併 與 : 次
- 合併 與 : 次
- 合併 與 : 次
- 最後合併 與 : 次
總比較次數:
Merge Sort 的最佳與最差時間複雜度皆為 。標準 Merge Sort 需要額外陣列,因此不是 In-Space,但合併時可維持相同元素順序,故為 Stable。
Quick Sort
第一個元素作為 pivot。對降冪排序而言, 是最大值,每次都成為其中一側的極端 pivot,形成最差情況。
比較次數為:
Quick Sort 的最佳時間複雜度為 ,最差為 。標準原地 Quick Sort 為 In-Space,但交換可能改變相同鍵值的相對順序,因此不是 Stable。