111 年 國立中央大學資訊管理學系碩士班甲組《資料結構》
第 1 題
Please describe the operations of "single linked list" and "doubly linked list." (4%)
Please explain the pros and cons of the two data structures. (4%)
登入後即可作答並保存紀錄。
核心觀念
- 鏈結串列 (Linked List):由一系列節點(Node)組成,每個節點保存資料欄位與指向下一個(或前後)節點的指標。
- 單向鏈結串列 (Singly Linked List, SLL):每個節點僅有一個指向「下一個」節點的指標
next。 - 雙向鏈結串列 (Doubly Linked List, DLL):每個節點同時保存指向「下一個」節點的指標
next與指向「前一個」節點的指標prev。 - 時間複雜度:插入、刪除、搜尋、遍歷等操作的漸進表示法。
- 空間複雜度:節點額外儲存指標的成本。
單向鏈結串列(Singly Linked List)之操作
| 操作 | 目的 | 常用演算法步驟 | 時間複雜度 | 空間額外成本 |
|---|---|---|---|---|
| 建立 | 初始化空鏈結串列 | head ← NULL | ||
| 遍歷 (Traversal) | 從頭到尾依序訪問每個節點 | ptr ← head; while(ptr ≠ NULL){ visit(ptr->data); ptr ← ptr->next; } | ||
| 搜尋 (Search) | 找出第一個值等於 key 的節點 | 同遍歷,途中檢查 ptr->data == key | ||
| 插入於頭部 (Insert‑Head) | 在 head 前加入新節點 | new->next ← head; head ← new; | ||
| 插入於尾部 (Insert‑Tail) | 在最後一個節點後加入新節點 | 若保有 tail 指標:tail->next ← new; tail ← new;<br>若無 tail:需遍歷至最後節點 | (有 tail)或 (無 tail) | |
| 插入於中間 (Insert‑After(p)) | 在已知節點 p 後插入 | new->next ← p->next; p->next ← new; | ||
| 刪除頭節點 (Delete‑Head) | 移除 head | temp ← head; head ← head->next; free(temp); | ||
| 刪除尾節點 (Delete‑Tail) | 移除最後一個節點 | 需遍歷至倒數第二節點 prev,然後 prev->next ← NULL(若有 tail 可直接) | (無 tail)或 (有 tail) | |
| 刪除中間節點 (Delete‑After(p)) | 刪除位於 p 之後的節點 | temp ← p->next; p->next ← temp->next; free(temp); |
特殊情況處理
- 空串列:
head == NULL時,插入頭部即為唯一節點;刪除操作需先檢查空性。 - 單節點:刪除頭/尾時需同時將
head(與tail)設為NULL。
雙向鏈結串列(Doubly Linked List)之操作
| 操作 | 目的 | 常用演算法步驟 | 時間複雜度 | 空間額外成本 |
|---|---|---|---|---|
| 建立 | 初始化空雙向串列 | head ← tail ← NULL | ||
| 遍歷 | 前向或後向遍歷 | 前向:ptr←head; while(ptr) { …; ptr←ptr->next; }<br>後向:ptr←tail; while(ptr) { …; ptr←ptr->prev; } | ||
| 搜尋 | 同遍歷,檢查 ptr->data | |||
| 插入於頭部 | 新節點成為新 head | new->next ← head; new->prev ← NULL; if(head) head->prev←new; head←new; if(tail==NULL) tail←new; |
第 2 題
Assume that the root of a tree structure is in Level 1. The level of a binary tree is 11.
a) How many nodes in total can be stored in the binary tree? (3%)
b) How many nodes can be stored in level 8? (3%)
登入後即可作答並保存紀錄。
核心觀念
- 二元樹(Binary Tree):每個節點最多有兩個子節點(左、右)。
- 層(Level):根節點所在層為第 1 層,子層遞增。第 k 層最多可容納 個節點。
- 滿二元樹(Full / Complete Binary Tree):若樹的高度為 h,且所有層均已填滿,則整棵樹的節點總數為
本題假設「二元樹」為滿二元樹(即每層皆能存滿節點),因此可直接套用上述公式。
解題方法
a) 計算第 11 層的二元樹可容納的總節點數
- 樹的高度(層數)。
- 依公式,總節點數
b) 計算第 8 層可容納的節點數
- 第 層的節點上限為 ,此處 。
- 因此第 8 層的節點數
選項分析(此題為填答題,分別對 a、b 兩小題說明)
第 3 題
Given the following traversal of a binary search tree:
Preorder: 15, 7, 2, 4, 9, 8, 30, 22, 17, 28, 45, 40, 37, 44
Inorder: 2, 4, 7, 8, 9, 15, 17, 22, 28, 30, 37, 40, 44, 45
a) Please give the results of postorder traversal. (8%)
b) Please illustrate the corresponding binary tree. (5%)
登入後即可作答並保存紀錄。
核心觀念
前序走訪的順序是「根、左子樹、右子樹」,因此每個子樹的前序序列第一個節點就是該子樹的根。中序走訪的順序是「左子樹、根、右子樹」;找到根在中序序列中的位置後,即可將其餘節點分成左、右子樹。
本題節點值皆相異,前序與中序序列足以唯一重建二元樹。由於這是一棵二元搜尋樹,其中序序列也必須由小到大排列;題目所給序列符合此性質。
解題方法
前序序列第一個值為根,因此整棵樹的根是 。在中序序列中, 左側的值屬於左子樹,右側的值屬於右子樹:
- 左子樹的中序序列:
- 右子樹的中序序列:
依照兩邊節點數量,將前序序列切分:
- 左子樹的前序序列:
- 右子樹的前序序列:
對左子樹,前序第一個值 是根。中序中 左側為 ,右側為 :
- 的左子樹前序為 ,中序為 ,所以根為 ,其右子節點為 。
- 的右子樹前序為 ,中序為 ,所以根為 ,其左子節點為 。
對右子樹,前序第一個值 是根。中序中 左側為 ,右側為 :
- 的左子樹前序為 ,中序為 ,所以根為 ,左子節點為 ,右子節點為 。
第 4 題
Give the data as: 15, 7, 22, 9, 63, 45, 17, 12
After the first pass (round) of quicksort, please give the order of the data. (6%)
登入後即可作答並保存紀錄。
快速排序第一輪分割 (以首元素為 pivot,Hoare 方式)
- 初始序列:。
- 取 ,左指標 從第 2 個元素起,右指標 從最後一個元素起。
- 迭代交換:
- 移至 (>), 停在 (<=),交換得到 。
第 5 題
A[5,2] address = 57, A[8,3] address = 93, element size = 1 byte, what is the
address of A [7,7]? (10%)
登入後即可作答並保存紀錄。
已知元素大小 ,設基底位址為 ,採用 欄主序 (column‑major) 之二維陣列存放方式
其中 為陣列的列數。
- 由 的位址
- 由 的位址
第 6 題
Please use Prefix (8%) and Postfix (8%) to express following mathematical expression:
12x375117+21+3
登入後即可作答並保存紀錄。
核心觀念
Prefix(前置式)與 Postfix(後置式)是運算子位置不同的表示法:
- 中置式(Infix):運算子放在兩個運算元中間,例如 。
- Prefix:運算子放在運算元之前,例如 。
- Postfix:運算子放在運算元之後,例如 。
本題須依照原式的運算優先順序解析:
- 乘法 優先於加法 。
- 加法採由左至右結合。
題目文字中的 x 視為乘法符號 ,並將 375117 視為一個整數,因此原式為:
其運算結構為:
解題方法
第一步:建立運算樹
依照優先順序,先處理乘法:
再依由左至右的規則處理加法:
最後再加上 :
對應的運算樹如下:
+
/ \
+ 3
/ \
× 21
/ \
12 375117
第二步:轉換為 Prefix
Prefix 表示法採用「根節點、左子樹、右子樹」的順序,即前序走訪運算樹。
依序得到:
- 最外層加法:
- 左子樹的加法:
- 乘法:
- 運算元:、
- 運算元:
- 最後的運算元:
因此 Prefix 為:
第 7 題7 分
We try to use an adjacency matrix to describe the needed cost units of international trade between seven countries. Each country is represented by a vertex, which are , , , , , , and .
Please use Kruskal’s algorithm to draw the minimum cost spanning tree.
登入後即可作答並保存紀錄。
核心觀念
本題考查以 Kruskal 演算法求無向加權圖的最小生成樹。
- 生成樹:連通所有頂點、沒有環的子圖。若有 個頂點,生成樹恰有 條邊。
- 最小生成樹:所有生成樹中,總權重最小者。
- Kruskal 演算法:將邊依權重由小到大排序,逐一考慮;若加入該邊不會形成環,就納入生成樹,直到選滿 條邊。
- 由於此題的權重可能相同,等權邊的處理順序可以不同,因此可能得到不同形狀、但總成本相同的最小生成樹。
解題方法
矩陣是對稱的,因此代表無向圖。只需取矩陣上三角的非無限值作為邊,並依權重由小到大排列:
| 權重 | 邊 |
|---|---|
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 11 | |
| 15 | |
| 20 |
依序套用 Kruskal 演算法:
| 考慮的邊 | 判斷 | 處理結果 |
|---|---|---|
| ,權重 1 | 兩端尚未連通 | 選入 |
| ,權重 1 | 兩端尚未連通 | 選入 |
| ,權重 2 | 連接兩個不同連通分量 | 選入 |
第 8 題20 分
Please use the data to describe the sorting process in ascending order, with the result of each round using insertion sort (4%).
Please also use C code (ANSI C) to implement an insertion sort function (8%) with binary search (8%).
登入後即可作答並保存紀錄。
核心觀念
插入排序將資料分成「已排序前綴」與「尚未處理部分」。每一回合取出尚未處理部分的第一個元素,插入已排序前綴中適當的位置,並將較大的元素向右移一格。重複此步驟,直到所有元素都納入已排序前綴。
本題要求列出升冪排序的每一回合結果,並以二分搜尋尋找插入位置、用 ANSI C 實作插入排序。
解題方法與逐回合排序
初始資料為:
每回合插入一個新元素;已排序前綴中的元素維持升冪。
| 回合 | 插入元素 | 插入後的完整序列 |
|---|---|---|
| 初始 | — | |
| 1 | ||
| 2 | ||
| 3 | ||
| 4 | ||
| 5 | ||
| 6 | ||
| 7 |
例如第 3 回合插入 時,已排序前綴為 。 小於前綴內所有元素,因此將 各右移一格,再把 放在前綴最前面。最後一回合插入 時, 大於 ,因此將 右移,並將 放在它原本的位置之前。
ANSI C 程式碼:二分搜尋插入排序
第 9 題10 分
Please draw a figure to explain the key(s), hash function, and bucket(s) when using a hash table, and illustrate their relationship (6%).
Furthermore, please explain the difference between MD5 and SHA-1 hash function outputs (4%).
登入後即可作答並保存紀錄。
核心觀念
解題方法先依原頁確認:第 9 題要求畫出雜湊表中「鍵值、雜湊函數、桶」的關係,並比較 MD5 與 SHA-1 的輸出;題目沒有提供指定鍵值或表格大小,因此以下用一般雜湊表示意。
雜湊表以鍵值 作為輸入,透過雜湊函數 算出桶的索引,再將資料存入對應的桶。常見的索引計算方式之一是取模,例如 ,其中 是桶的數量。不同鍵值可能算出相同索引,稱為碰撞;可用鏈結串列等方式在同一桶中保存多筆資料。
解題方法
圖中以兩個不同鍵值 、 示範碰撞:雜湊函數將兩者都映射到索引 ,因此兩筆資料都存入桶 。
鍵值 k₁ ──┐
├──> 雜湊函數 h(k) ──> 索引 j ──> 桶 j:[資料(k₁), 資料(k₂)]
鍵值 k₂ ──┘
因 h(k₁) = h(k₂),產生碰撞
查詢時,先對欲查找的鍵值計算雜湊索引,再到對應桶中比對鍵值,確認是否找到目標資料。雜湊函數負責把鍵值轉成索引;桶則是存放資料的位置。
第 10 題4 分
Please briefly explain the average (2%) and worst-case (2%) time complexity, in Big O notation, of a hash table data structure when processing a search action.
登入後即可作答並保存紀錄。
核心觀念
原頁圖第 10 題詢問雜湊表執行「搜尋」時,平均情況與最壞情況的時間複雜度,並要求以 Big O 表示。
雜湊函數會把鍵值映射到表中的位置;若不同鍵值映射到同一位置,就會發生碰撞。搜尋時間主要取決於碰撞的多寡,以及碰撞處理方式。
解題方法
分析搜尋時,先看雜湊函數能否直接定位鍵值,再看目標位置是否因碰撞而需要額外比對。
- 平均情況:
假設雜湊函數能均勻分布鍵值,且表的負載因子維持在適當範圍,碰撞數量平均受控。雜湊函數定位後,只需比對少數元素,因此平均搜尋時間為 。若使用鏈結法,平均時間可寫成 ,其中 是負載因子;