內插搜尋 (Interpolation Search) 是一種基於數值分布估算落點的搜尋演算法,是對 二元搜尋 (Binary Search) 的改良。它特別適合用在已排序且元素分布相對均勻的資料集上,能有效地減少搜尋次數。
二元搜尋每次都「取中間」,假設資料大致均勻地分佈,但若目標值靠近開頭,仍會浪費許多比較。
舉例: 假設我們要找 3
核心概念: 根據數值的相對大小,估計出目標可能所在的位置。
在每次搜尋中,透過「線性內插公式」計算預估位置 pos:
pos = left + (target - arr[left]) * (right - left) // (arr[right] - arr[left])
如果 arr[left] == arr[right](例如所有元素相同),為避免除以 0,應直接檢查元素是否等於 target。
若未找到 → 回傳 -1
def interpolation_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right and arr[left] <= target <= arr[right]:
if arr[left] == arr[right]:
if arr[left] == target:
return left
else:
break
# 根據比例計算預估位置
pos = left + (target - arr[left]) * (right - left) // (arr[right] - arr[left])
if arr[pos] == target:
return pos
elif arr[pos] < target:
left = pos + 1
else:
right = pos - 1
return -1
# 測試
arr = [10, 20, 30, 40, 50, 60, 70]
print(interpolation_search(arr, 40)) # 輸出: 3
print(interpolation_search(arr, 25)) # 輸出: -1
面向 | Binary Search | Interpolation Search |
---|---|---|
採樣方式 | 每次取中間點 | 根據值比例推算落點 |
平均時間 | O(log n) | O(log log n) (分布均勻) |
最壞時間 | O(log n) | O(n) |
是否需均勻分布 | 否 | 是 |
是否穩定 | 穩定 | 分布不均會退化 |
內插搜尋是一種在特定條件下非常高效的搜尋演算法,它的思維突破了「固定折半」,改用「依值推估位置」來直接逼近目標。
雖然在最壞情況下效能會退化,但如果資料分布均勻、且查詢遠多於更新操作,它能比 Binary Search 更快,是搜尋問題中一個非常值得認識的技巧。