擁抱「資料結構」的「演算法」(26) - 內插搜尋法
前言 今天要來介紹 內插搜尋法 ,這個名字聽起來就很抽象,不容易知道這個演算法是如何進行搜尋的,一起來認識它吧! 生活常識 唸大學的時候,如果可以 自由挑選座位 ,你都是做在哪邊的位置上呢?是挑前面的位置認真 上課 ,還是挑後面的位置方便 翹課 XD,想必你對於坐前面或坐後面有一套自己的挑選方式,而如果是站在 授課老師的角度 ,老師會 挑選 坐 前面 的學生來回答問題,還是挑 後面 的學生來回答問題呢?如何在教室內挑到一位合適的學生來回答不同難易程度的問題,這真的是很考驗老師的搜尋能力,感覺坐越 前面 的 參與度越高 ,越 後面 的 參與度越低 ,到底要挑選哪一區的哪一位同學來回答,想必老師也有一套挑選學生的方式 圖片來源: https://www.pexels.com/zh-tw/photo/207691/ 專業知識 - 內插搜尋法 Interpolation Search 內插搜尋法 又稱 插補搜尋法 ,主要是針對 已排序 的資料進行搜尋,算是二分搜尋法的改良版本,二分法會先找中間值,但 內插 搜尋法會透過 斜率公式 初步估算資料可能出現在 哪個的位置 ,很像在一個 範圍 內 插入 一個可能的位置,並逐漸 縮小 搜尋範圍 斜率公式 可參考維基百科 圖片來源: https://zh.wikipedia.org/wiki/%E6%96%9C%E7%8E%87 插補搜尋法公式 假設 X 軸 為陣列索引 , Y 軸 為 由小到大 排列的儲存的數值,我們可藉由 終點(x2, y2)與起點(x1, y1)的斜率 會等於 目標點(x-key, y-value)與起點(x1, y1)的斜率`去推出資料可能的位置 例子 有一數列:1, 22, 32, 48, 56, 63, 47, 82, 94,共 9 個數值,由小到大排列,要找 48 在哪裡,套用公式時,若求出來的值有小數點則四捨五入(或使用你習慣的方式處理小數點也可以),以下分為兩個步驟進行搜尋: 第一次的公式代入得到 X 軸 = 4 ,則去找陣列索引 4 的位置,找到的數值為 56 ,56 不等於 48,繼續搜尋 第二次的公式代入,得到數值 X 軸 = 3,則去找陣列索引 3 的位置,找到的數值為 48 ,48 等於 48,成功找到數值則結束搜尋 分析 效能的好壞取決於數值的分佈,如果資料分佈的越平...