Skip to content
本站總訪問量
本站訪客數 人次

插補搜尋

介紹

插補搜尋(Interpolation Search)是一種搜尋演算法,適用於已排序的數據。它利用內插法的概念來估計目標值的位置,從而加快搜尋速度。與二分搜尋不同,插補搜尋假設數據是線性分佈的,並根據這一假設來計算中間位置(mid)。

以上圖的公式 2 為例,當我們用要尋找的值(key)來算出 mid 的時候,比較 mid 是在右半部或是左半部。若是右半部則將 low 的邊界改為 mid,再重複一次圖上的公式 2,反覆運算後直到 mid 等於我們要尋找的值並輸出。反之亦然。

插補搜尋的步驟

  1. 初始化邊界:設置 low 為數據的起始索引,upper 為數據的結束索引。
  2. 計算中間位置:使用內插公式計算 midmid=low+((upperlow)×(keydata[low])data[upper]data[low])
  3. 比較與調整邊界
    • 如果 data[mid] 等於目標值 key,則返回 mid
    • 如果 data[mid] 大於 key,則將 upper 設為 mid - 1
    • 如果 data[mid] 小於 key,則將 low 設為 mid + 1
  4. 重複步驟 2 和 3,直到找到目標值或 low 超過 upper

範例程式碼

以下是插補搜尋的 Python 範例:

python
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def interpolation_search(data, key):
    low = 0
    upper = len(data) - 1
    while low <= upper:
        mid = int((upper - low) * (key - data[low]) / (data[upper] - data[low]) + low)
        if mid < low or mid > upper:
            break
        if key < data[mid]:
            upper = mid - 1
        elif key > data[mid]:
            low = mid + 1
        else:
            return mid

    return -1

index = interpolation_search(data, 6)
if index >= 0:
    print(index)
else:
    print("找不到數值")

優點與限制

  • 優點:在數據均勻分佈的情況下,插補搜尋的效率比二分搜尋更高,平均時間複雜度為 O(loglogn)
  • 限制:如果數據分佈不均勻,插補搜尋的性能可能會下降,最壞情況下時間複雜度為 O(n)

插補搜尋適用於數據分佈均勻且已排序的情況,可以有效提高搜尋效率。

資源來源

Contributors

The avatar of contributor named as lucashsu95 lucashsu95

Changelog