108 地方特考三等 資訊處理 資料結構 考古題詳解
第 一 題20 分
對下列三個程式片段,請使用 Big-O 符號,分別估計其最長執行時間(worst time)。程式片段中, 代表一段沒有與 相關的迴圈(no -dependent loops)。
(一)(5 分)
(二)(5 分)
(三)(10 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查迴圈的執行次數與漸近時間複雜度。若每次迴圈執行固定時間的片段 ,總時間便與迴圈次數同階;題目已說明 沒有與 相關的迴圈,因此可視為 。
分析時,先由迴圈條件求出控制變數的範圍,再估計迴圈執行次數。Big-O 表示執行時間的漸近上界;本題的迴圈次數也都能得到對應的緊確階數。
解題方法與推導
(一)
for (int i = 0; i*i < n; i++)
S
迴圈從 開始,每次增加 ,持續到 為止。條件 等價於:
因此迴圈執行約 次。每次執行的 為 ,所以:
(二)
for (int i = 0; Math.sqrt(i) < n; i++)
S
條件是 。由於 ,兩邊平方可得:
第 二 題20 分
有下列資料元素(data elements),其數值越小則優先權(priority)越高。請分別依序將各元素加入(add)優先佇列(priority queue)中,且分別以下列三種資料結構實作之:
(一) 用雙向鏈接串列(doubly-linked list)來實作此優先佇列,請畫出其資料結構圖。(6 分)
(二) 用紅黑樹(red-black tree)來實作此優先佇列,請畫出其資料結構圖。注意:紅節點請標示 R,例如 表示其值為 20 的紅(Red)節點;黑節點則請標示 B,例如 表示其值為 50 的黑(Black)節點。(7 分)
(三) 用最小堆積(min heap)來實作此優先佇列,請畫出其資料儲存的陣列(array)圖。注意:陣列索引(array index)由左向右遞增。(7 分)
登入後即可作答並保存紀錄。
核心觀念
本題比較三種優先佇列實作方式。數值越小,優先權越高,因此優先佇列的取出端應是最小值。
- 雙向鏈結串列:每個節點有前、後指標,可將元素依優先權排序後串接。
- 紅黑樹:依二元搜尋樹規則插入,並按紅黑樹規則重新著色、旋轉;每次插入後根節點為黑色。
- 最小堆積:完全二元樹,且每個節點的值不大於其子節點。以陣列表示時,索引由左至右、由上而下排列。
以下均依序插入 。
解題方法
(一) 雙向鏈結串列
將節點依數值由小到大排列,使優先權最高的元素位於串列前端。如此可由頭端取得最小值;插入時將新節點放在符合排序的位置。
依序插入後,串列為:
頭 ⇄ 10 ⇄ 20 ⇄ 30 ⇄ 40 ⇄ 50 ⇄ 70 ⇄ 80 ⇄ 90 ⇄ 尾
每一組相鄰節點間均有雙向連結;頭、尾端未連向其他節點的指標為空。
(二) 紅黑樹
依序以二元搜尋樹規則插入各值;新節點先著紅色,再依紅黑樹規則修正。修正時需維持根為黑色、紅節點不得有紅色子節點,且每條由節點通往空葉的路徑具有相同黑節點數。
逐步插入的主要結構變化如下:
- 插入 :成為根,著黑。
- 插入 :成為 的左子節點,著紅。
- 插入 :形成左右交錯的紅紅違規,經旋轉與重新著色後, 成為黑根,、 為紅。
- 插入 :父節點與叔節點皆紅,重新著色。
- 插入 :經旋轉與重新著色修正。
- 插入 :父節點與叔節點皆紅,重新著色。
- 插入 :經旋轉與重新著色修正。
- 插入 :父節點與叔節點皆紅,重新著色;根維持黑色。
最後的紅黑樹如下:
50B
/ \
20R 80R
/ \ / \
10B 40B 70B 90B
/
30R
(三) 最小堆積
第 三 題20 分
下圖為一棵 2-3-4 樹。
(一) 請畫出對應的紅黑樹(red-black tree)。請參閱上題紅黑樹節點的標示說明。(6 分)
(二) 首先,插入(insert)33;接著,刪去(delete)78。請分別畫出對應的 2-3-4 樹與紅黑樹。(14 分)
登入後即可作答並保存紀錄。
核心觀念
2-3-4 樹的每個節點可包含 1 至 3 個鍵值。轉換成紅黑樹時:
- 1 個鍵值的節點對應一個黑色節點。
- 2 個鍵值的節點以較大的鍵值作黑色節點、較小的鍵值作其紅色左子節點。
- 3 個鍵值的節點以中間鍵值作黑色節點,較小與較大的鍵值分別作紅色左、右子節點。
以下以「鍵值(顏色)」標示紅黑樹節點。每個 2-3-4 樹節點對應的黑色節點及其紅色子節點,合起來就是原節點。
解題方法
先依 2-3-4 樹的節點鍵值及子樹區間,轉成對應的紅黑樹。插入與刪除則先在 2-3-4 樹上完成,再用相同規則轉成紅黑樹。
(一)原樹對應的紅黑樹
根節點 [40, 62, 83] 是三鍵值節點,因此以 62 為黑色節點,40、83 為紅色子節點。其餘節點依同一規則轉換:
62(黑)
├─L:40(紅)
│ ├─L:20(黑)
│ │ ├─L:10(紅)
│ │ └─R:31(紅)
│ └─R:55(黑)
│ └─L:45(紅)
└─R:83(紅)
├─L:78(黑)
│ └─L:70(紅)
└─R:92(黑)
└─L:90(紅)
例如,葉節點 [10, 20, 31] 轉成以 20 為黑色節點、10 與 31 為紅色子節點。
(二)插入 33,再刪除 78
先插入 33
從根節點 [40, 62, 83] 開始,該節點已滿,先將 62 分裂提升為新根。接著往左搜尋,遇到滿節點 [10, 20, 31],將 20 提升到父節點;此時父節點成為 [20, 40],原節點分成 [10] 與 [31]。最後將 33 插入 [31],形成 [31, 33]。
插入後的 2-3-4 樹為:
第 四 題20 分
下面的無向圖(undirected graph)表示四個人的關係,如張三與李四有關係,這二人之間有邊(edge)相連,則可走訪。括弧內為人名縮寫,如張三(Chang San)的縮寫為 CS。若同時有兩個以上的人可處理,則先處理人名縮寫的字母順序較小者。
圖中四人及其關係如下:
- 李四(LS)
- 張三(CS)
- 王五(WW)
- 趙六(CL)
圖中邊的連接關係依原圖表示。
(一) 由張三(CS)出發,用佇列(queue)做廣度優先搜尋(breadth-first search)走訪所有人,請寫出走訪順序的中文人名。(10 分)
(二) 由張三(CS)出發,用堆疊(stack)做深度優先搜尋(depth-first search)走訪所有人,請寫出走訪順序的中文人名。(10 分)
登入後即可作答並保存紀錄。
核心觀念
廣度優先搜尋(BFS)使用佇列,依「先進先出」逐層走訪;深度優先搜尋(DFS)使用堆疊,沿著尚未走訪的相鄰節點深入,再回溯。走訪時將已走訪的人標記,避免重複處理。
依圖中的連線,鄰接關係為:
- 張三(CS):李四(LS)、趙六(CL)
- 李四(LS):張三(CS)、王五(WW)、趙六(CL)
- 王五(WW):李四(LS)、趙六(CL)
- 趙六(CL):張三(CS)、李四(LS)、王五(WW)
同時有多個可選人名時,依縮寫字母順序先處理較小者。
解題方法
(一) BFS:使用佇列
從張三(CS)出發。張三尚未走訪的鄰居為 CL、LS,依字母順序將趙六、李四加入佇列。
| 步驟 | 處理的人 | 新加入佇列的人 |
|---|---|---|
| 1 | 張三(CS) | 趙六(CL)、李四(LS) |
| 2 | 趙六(CL) | 王五(WW); |
第 五 題20 分
將下列六個鍵值:
存入大小為 19 的雜湊表(a hash table of size 19)。雜湊函數 為:
分別用下面兩種衝突處理方式(collision handler):
(一) 間隔為 1(offset of 1)(12 分)
(二) 間隔為商(quotient-offset)(8 分)
請分別寫出兩個雜湊表;並在間隔為 1 的雜湊表上,標示出一次聚集(primary clustering)。
登入後即可作答並保存紀錄。
核心觀念
本題考查雜湊函數與開放定址法中的線性探測。鍵值的初始位置為
若初始位置已被占用,便依指定的探測間隔逐格尋找空位。探測位置超出索引範圍時,以模數 繞回表格開頭。
「間隔為 1」每次往後移一格;「間隔為商」則將鍵值除以表格大小所得的商作為探測間隔,也就是探測位置依序為 ,其中 。
解題方法
先依題目給定的鍵值順序計算初始位置,再依各方法的探測規則,將每個鍵值放入第一個空位。
(一)間隔為 1
每次碰撞後,索引加 ,並以 為模數:
| 鍵值 | 初始位置 | 探測與放置 |
|---|---|---|
| 放入索引 | ||
| 放入索引 | ||
| 、 已占用,放入索引 | ||
| 放入索引 | ||
| 已占用,探測 ,放入索引 | ||
| 至 已占用,探測後繞回索引 ,放入索引 |
因此,雜湊表如下:
| 索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 內容 | 109 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 空 | 33 | 72 | 71 | 55 | 112 |
(二)間隔為商
探測間隔為 。每次碰撞後,索引依此間隔前進,並以 為模數。
| 鍵值 | 初始位置 | 探測間隔 | 探測與放置 |
|---|---|---|---|
| 放入索引 | |||
| 放入索引 | |||
| 已占用,探測 ,放入索引 |