111 身心障礙特考三等 資訊處理 資料結構 考古題詳解
第 一 題25 分
請回答下列 Big O 的相關問題:
(一) Big O Notation,根據維基百科又稱為漸進符號,它是用於描述演算法漸進行為的數學符號。更確切地說,它用更簡單的函式來描述一個演算法在數量上的漸進趨勢。
某個問題可採用 5 個演算法 ~ 求解,各演算法執行時間的 Big O 分別如下:
- 為
- 為
- 為
- 為
- 為
當 很大時,請根據演算法的執行時間,由慢至快排序這 5 個演算法。(10 分)
(二) 給定 100 萬個介於 0 到 100(含 0 及 100)的整數,請利用任一種高階程式語言寫出一個 的由大至小排序演算法,並說明此演算法為何是 的方法。(15 分)
登入後即可作答並保存紀錄。
核心觀念
Big O 描述輸入規模 增大時,演算法執行時間的漸進成長率。比較時忽略常數因子與低階項,重點是比較各成長函式的快慢。
本題考的是不同成長率的排序,以及利用資料值域有限的特性,以計數排序達成線性時間。
解題方法
(一)依執行時間由慢至快排序
常用成長率由慢至快的關係為:
逐項比較:
- :次線性成長,最慢。
- :比 快,但比 慢。
- :介於一次與二次成長之間。
- :平方成長。
- :在平方成長上再乘以 ,成長最快。
題目要求由慢至快,因此順序為:
(二)值域有限的 由大至小排序
資料共有 個整數,且每個值都介於 到 。值域只有 種,因此可以使用計數排序:先統計每個數值出現的次數,再依數值由大至小輸出相應次數。
以下以 Python 表示,假設輸入資料存放於串列 data:
第 二 題30 分
以下 7 個數字 要儲存到 Hash Table 中。Hash Table 的儲存空間是一個索引從 0 開始的一維陣列(Array)。
假設 Hash 函數為:
裝填因子(Load Factor)為 0.7。
(一) 若處理 Hash Table 衝突的方法為開放定址法(Open Addressing Hashing)中的線性探測法(Linear Probing),增量函數為:
其中 為衝突的次數。
請依序列出每存入一個數字後的 Hash Table 內容。接著計算在相同機率的情況下,查找成功及查找失敗的平均查找長度(Average Search Length,ASL)。(15 分)
(二) 若處理 Hash Table 衝突的方法為開放定址法(Open Addressing Hashing)中的平方探測法(Quadratic Probing),增量函數為:
其中 為衝突的次數。
請依序列出每存入一個數字後的 Hash Table 內容。接著計算在相同機率的情況下,查找成功及查找失敗的平均查找長度(Average Search Length,ASL)。(15 分)
登入後即可作答並保存紀錄。
核心觀念
裝填因子定義為
其中 是資料筆數, 是雜湊表大小。本題有 筆資料、,因此
雜湊表索引為 至 。初始位置依題目公式計算:
發生碰撞時,探測位置採用 ,其中第一次檢查的增量為 。查找成功的 ASL 是各已存資料所需探測次數的平均;查找失敗的 ASL 是各可能初始位置所需探測次數的平均。本題的雜湊值只會落在 至 ,故失敗查找按這 7 個初始位置等機率計算。
(一)線性探測法
線性探測的增量函數為 ,因此碰撞後依序往下一格探測,並以表格大小 為模數。
| 存入資料 | 雜湊位置 | 探測過程 | 存入後的 Hash Table(索引 至 ) |
|---|---|---|---|
| 21 | 0 | ||
| 1 | 3 | ||
| 16 | 6 | ||
| 11 | 5 | ||
| 25 | 5 | ||
| 9 | 6 | ||
| 35 | 0 |
查找成功的 ASL
依序對應 ,探測次數為 。因此
查找失敗的 ASL
從初始位置 至 開始查找,遇到空格即判定查找失敗。各初始位置的探測次數如下:
| 初始位置 | 探測位置 | 探測次數 |
|---|---|---|
| 0 | 3 | |
| 1 | 2 | |
| 2 | 1 | |
| 3 | 2 | |
| 4 | 1 | |
| 5 | 5 | |
| 6 | 4 |
故
(二)平方探測法
第 三 題25 分
請寫出對以下 8 個數字 ,依序建構最小堆積樹(Min Heap Tree)的過程。
為方便最小堆積樹的建構,通常會使用一個一維陣列來儲存堆積樹中的數字。請說明如何用一維陣列來處理最小堆積樹的建構。
最小堆積樹建構完成後,請寫出如何用此樹依序將數字由小到大的排序過程。請說明此種排序法的計算複雜度 Big O 為何?(25 分)
登入後即可作答並保存紀錄。
核心觀念
最小堆積樹(Min Heap)是一棵完全二元樹,且每個節點的鍵值都小於或等於其子節點。因此,根節點是目前堆中最小的數。
若用一維陣列由上而下、由左而右儲存堆積樹,採用 1 起始索引時,索引為 的節點:
- 父節點索引:
- 左子節點索引:
- 右子節點索引:
依序插入新數字時,先將數字放在陣列末端,再與父節點比較;若新數字較小,就交換並繼續向上調整,直到符合最小堆積性質。
解題方法:依序建構最小堆積
將數字依題目順序逐一插入,每次插入後進行向上調整:
| 插入數字 | 插入及調整後的陣列 |
|---|---|
| 44 | |
| 62 | |
| 31 | |
| 5 | |
| 82 | |
| 49 | |
| 16 | |
| 7 |
因此,建構完成的最小堆積陣列為:
對應的樹形如下:
5
/ \
7 31
/ \ / \
16 82 44 49
/
62
第 四 題20 分
下圖中有 4 個城市、8 條公路,公路上的數字表示這條公路的長短。請注意,這些公路是單向的。
【題目圖表】 (原卷圖表未包含於文字層擷取結果,請參考原卷。)
若使用 Floyd Warshall 的動態規劃法求解從任意兩個城市之間的最短路徑,請回答下列問題:
(一) 首先將圖的資訊建成一個 的初始距離矩陣,其中 是節點的個數。矩陣的各列(Rows)代表 From Nodes,各行(Columns)代表 To Nodes,矩陣中的值則分別代表上圖中從 From Node 到 To Node 的距離。(5 分)
(二) 其次列舉從 到 的最短路徑求解過程(需輸出最短路徑的值及路徑),並說明此方法的計算複雜度 Big O 為何。(15 分)
登入後即可作答並保存紀錄。
核心觀念
本題考查有向加權圖的 Floyd–Warshall 全點對最短路徑演算法。
令 表示:允許前 個節點作為中繼點時,從節點 到節點 的最短距離。其遞迴公式為
也就是比較:
- 不經過節點 ;
- 經過節點 。
本圖為單向道路,因此 與 必須分別判斷,不能將道路視為雙向。
解題方法
依圖可讀出 8 條有向道路:
節點排列順序採用 。
(一)初始距離矩陣
主對角線為 ;沒有直接道路的位置設為 。
其中列代表 From Node,欄代表 To Node。例如:
- 表示 的距離為 ;
- 表示 的距離為 ;
- 表示沒有直接的 道路。
(二)求 到 的最短路徑
以 為中繼點
可經過 :
因此將原本的 更新為 。
同時:
得到
以 為中繼點
可經過 :
也可經過 :
因此