108 地方特考三等 資訊處理 資料結構 考古題詳解

108 年・地方特考・三等・資訊處理
試題代碼 資料結構

第 一 題20 分

對下列三個程式片段,請使用 Big-O 符號,分別估計其最長執行時間(worst time)。程式片段中,SS 代表一段沒有與 nn 相關的迴圈(no nn-dependent loops)。

(一)(5 分)

for (int i=0; i∗i<n; i++)S\text{for }(int\ i=0;\ i*i<n;\ i++)\\ \qquad S

(二)(5 分)

for (int i=0; Math.sqrt⁡(i)<n; i++)S\text{for }(int\ i=0;\ \operatorname{Math.sqrt}(i)<n;\ i++)\\ \qquad S

(三)(10 分)

int k=1;for (int i=0; i<n; i++)k∗=2;for (int i=0; i<k; i++)Sint\ k=1;\\ \text{for }(int\ i=0;\ i<n;\ i++)\\ \qquad k*=2;\\ \text{for }(int\ i=0;\ i<k;\ i++)\\ \qquad\qquad S

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查迴圈的執行次數與漸近時間複雜度。若每次迴圈執行固定時間的片段 SS,總時間便與迴圈次數同階;題目已說明 SS 沒有與 nn 相關的迴圈,因此可視為 O(1)O(1)。

分析時,先由迴圈條件求出控制變數的範圍,再估計迴圈執行次數。Big-O 表示執行時間的漸近上界;本題的迴圈次數也都能得到對應的緊確階數。

解題方法與推導

(一)

for (int i = 0; i*i < n; i++)
 S

迴圈從 i=0i=0 開始,每次增加 11,持續到 i2≥ni^2\ge n 為止。條件 i2<ni^2<n 等價於:

i<ni<\sqrt{n}

因此迴圈執行約 n\sqrt{n} 次。每次執行的 SS 為 O(1)O(1),所以:

T(n)=O(n)T(n)=O(\sqrt{n})

(二)

for (int i = 0; Math.sqrt(i) < n; i++)
 S

條件是 i<n\sqrt{i}<n。由於 i,n≥0i,n\ge 0,兩邊平方可得:

i<n2i<n^2
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 二 題20 分

有下列資料元素(data elements),其數值越小則優先權(priority)越高。請分別依序將各元素加入(add)優先佇列(priority queue)中,且分別以下列三種資料結構實作之:

90, 10, 80, 20, 70, 50, 40, 3090,\ 10,\ 80,\ 20,\ 70,\ 50,\ 40,\ 30

(一) 用雙向鏈接串列(doubly-linked list)來實作此優先佇列,請畫出其資料結構圖。(6 分)

(二) 用紅黑樹(red-black tree)來實作此優先佇列,請畫出其資料結構圖。注意:紅節點請標示 R,例如 20R20R 表示其值為 20 的紅(Red)節點;黑節點則請標示 B,例如 50B50B 表示其值為 50 的黑(Black)節點。(7 分)

(三) 用最小堆積(min heap)來實作此優先佇列,請畫出其資料儲存的陣列(array)圖。注意:陣列索引(array index)由左向右遞增。(7 分)

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題比較三種優先佇列實作方式。數值越小,優先權越高,因此優先佇列的取出端應是最小值。

  • 雙向鏈結串列:每個節點有前、後指標,可將元素依優先權排序後串接。
  • 紅黑樹:依二元搜尋樹規則插入,並按紅黑樹規則重新著色、旋轉;每次插入後根節點為黑色。
  • 最小堆積:完全二元樹,且每個節點的值不大於其子節點。以陣列表示時,索引由左至右、由上而下排列。

以下均依序插入 90,10,80,20,70,50,40,3090,10,80,20,70,50,40,30。

解題方法

(一) 雙向鏈結串列

將節點依數值由小到大排列,使優先權最高的元素位於串列前端。如此可由頭端取得最小值;插入時將新節點放在符合排序的位置。

依序插入後,串列為:

頭 ⇄ 10 ⇄ 20 ⇄ 30 ⇄ 40 ⇄ 50 ⇄ 70 ⇄ 80 ⇄ 90 ⇄ 尾

每一組相鄰節點間均有雙向連結;頭、尾端未連向其他節點的指標為空。

(二) 紅黑樹

依序以二元搜尋樹規則插入各值;新節點先著紅色,再依紅黑樹規則修正。修正時需維持根為黑色、紅節點不得有紅色子節點,且每條由節點通往空葉的路徑具有相同黑節點數。

逐步插入的主要結構變化如下:

  1. 插入 9090:成為根,著黑。
  2. 插入 1010:成為 9090 的左子節點,著紅。
  3. 插入 8080:形成左右交錯的紅紅違規,經旋轉與重新著色後,8080 成為黑根,1010、9090 為紅。
  4. 插入 2020:父節點與叔節點皆紅,重新著色。
  5. 插入 7070:經旋轉與重新著色修正。
  6. 插入 5050:父節點與叔節點皆紅,重新著色。
  7. 插入 4040:經旋轉與重新著色修正。
  8. 插入 3030:父節點與叔節點皆紅,重新著色;根維持黑色。

最後的紅黑樹如下:

 50B
 / \
 20R 80R
 / \ / \
 10B 40B 70B 90B
 /
 30R

(三) 最小堆積

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 三 題20 分

下圖為一棵 2-3-4 樹。

406283102031455570789092\begin{array}{c} 40\quad 62\quad 83\\[4pt] 10\quad 20\quad 31\qquad 45\quad 55\qquad 70\quad 78\qquad 90\quad 92 \end{array}

(一) 請畫出對應的紅黑樹(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 樹為:

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 四 題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);
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 五 題20 分

將下列六個鍵值:

33, 72, 71, 55, 112, 10933,\ 72,\ 71,\ 55,\ 112,\ 109

存入大小為 19 的雜湊表(a hash table of size 19)。雜湊函數 hh 為:

h(key)=key mod 19h(\text{key})=\text{key}\bmod 19

分別用下面兩種衝突處理方式(collision handler):

(一) 間隔為 1(offset of 1)(12 分)

(二) 間隔為商(quotient-offset)(8 分)

請分別寫出兩個雜湊表;並在間隔為 1 的雜湊表上,標示出一次聚集(primary clustering)。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查雜湊函數與開放定址法中的線性探測。鍵值的初始位置為

h(k)=k mod 19h(k)=k\bmod 19

若初始位置已被占用,便依指定的探測間隔逐格尋找空位。探測位置超出索引範圍時,以模數 1919 繞回表格開頭。

「間隔為 1」每次往後移一格;「間隔為商」則將鍵值除以表格大小所得的商作為探測間隔,也就是探測位置依序為 h(k)+i⌊k/19⌋(mod19)h(k)+i\lfloor k/19\rfloor \pmod{19},其中 i=0,1,2,…i=0,1,2,\ldots。

解題方法

先依題目給定的鍵值順序計算初始位置,再依各方法的探測規則,將每個鍵值放入第一個空位。

(一)間隔為 1

每次碰撞後,索引加 11,並以 1919 為模數:

鍵值初始位置探測與放置
333333 mod 19=1433\bmod19=14放入索引 1414
727272 mod 19=1572\bmod19=15放入索引 1515
717171 mod 19=1471\bmod19=141414、1515 已占用,放入索引 1616
555555 mod 19=1755\bmod19=17放入索引 1717
112112112 mod 19=17112\bmod19=171717 已占用,探測 1818,放入索引 1818
109109109 mod 19=14109\bmod19=141414 至 1818 已占用,探測後繞回索引 00,放入索引 00

因此,雜湊表如下:

索引0123456789101112131415161718
內容109空空空空空空空空空空空空空33727155112

(二)間隔為商

探測間隔為 ⌊k/19⌋\lfloor k/19\rfloor。每次碰撞後,索引依此間隔前進,並以 1919 為模數。

鍵值初始位置探測間隔探測與放置
33331414⌊33/19⌋=1\lfloor33/19\rfloor=1放入索引 1414
72721515⌊72/19⌋=3\lfloor72/19\rfloor=3放入索引 1515
71711414⌊71/19⌋=3\lfloor71/19\rfloor=31414 已占用,探測 (14+3) mod 19=17(14+3)\bmod19=17,放入索引 1717
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

其他考古題