📜  插值搜索(1)

📅  最后修改于: 2023-12-03 15:10:11.477000             🧑  作者: Mango

插值搜索

插值搜索(interpolation search)是一种在有序数组中查找给定值的高效算法。与二分搜索(binary search)不同的是,插值搜索从数组的特定位置开始搜索,而不是中间点。这个特定位置的选择是基于目标值的估计。

插值搜索的时间复杂度最坏情况下为 $O(n)$,但在平均情况下,其复杂度为 $O(log\ log\ n)$。

插值搜索的基本原理是通过目标值与数组中的最小值和最大值之间的比较,以估计目标值在数组中的位置。例如,如果目标值与数组的最小值相等,则其位置已知。否则,我们将目标值在最小值和最大值之间进行插值比较,并根据比较结果移动搜索位置。

算法步骤
  1. 求出目标值的估计位置:

    pos = low + ((high - low) / (arr[high] - arr[low])) * (target - arr[low])

    这里, pos 是估计位置, lowhigh 是数组的最小值和最大值。公式中的 (target - arr[low]) 是目标值与最小值之间的距离, (arr[high] - arr[low]) 是最大值和最小值之间的距离。

  2. 与估计位置处的值进行比较:

    • 如果目标值小于 arr[pos],在数组的左半部分进行插值搜索。
    • 如果目标值大于 arr[pos],在数组的右半部分进行插值搜索。
    • 如果目标值等于 arr[pos],返回 pos
  3. 重复步骤1和步骤2,直到找到目标值或搜索空间为空。

代码实现

以下是插值搜索的 Python 代码实现:

def interpolation_search(arr, target):
    low, high = 0, len(arr) - 1

    while low <= high and arr[low] <= target <= arr[high]:
        pos = low + ((high - low) // (arr[high] - arr[low])) * (target - arr[low])

        if arr[pos] == target:
            return pos
        elif arr[pos] < target:
            low = pos + 1
        else:
            high = pos - 1

    return -1

此代码使用了 while 循环来搜索目标值。首先,我们设置搜索区间的边界为数组的最小值和最大值。接下来,我们在 while 循环中进行插值搜索,直到我们找到目标值或搜索区间为空。

如果我们找到目标值,返回其位置;如果搜索区间为空,返回 -1。