插值查找

一、介绍

1、插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。
2、将折半查找中的求mid索引的公式,low表示左边索引left,high表示右边索引right. key 就是前面我们讲的 findVal


在这里插入图片描述

3、int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/
对应前面的代码公式:

int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

4、举例说明插值查找算法 1-100 的数组

在这里插入图片描述

二、代码

public class InsertValueSearch {
    public static void main(String[] args) {
        int arr[] = {1, 8, 10, 89, 1000, 1000, 1234};
        int index = search(arr, 0, arr.length - 1, 89);
        System.out.println("index = " + index);
    }
 
 private static int search(int[] array, int left, int right, int key) {
    while (left <= right) {
        if (array[right] == array[left]) {
            if (array[right] == key)
                return right;
            else return -1;
        }
        int middle = left + ((key - array[left]) / (array[right] - array[left])) * (right - left);
        if (array[middle] == key) {
            return middle;
        }
        if (key < array[middle]) {
            right = middle - 1;
        } else {
            left = middle + 1;
        }
    }
    return -1;
}

三、插值查找注意事项:

  1. 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
  2. 关键字分布不均匀的情况下,该方法不一定比折半查找要好

你可能感兴趣的:(插值查找)