插值查找算法

1、插值查找算法

  插值查找是对二分查找的优化,是有序序列的查找算法。二分查找选取中间位置,插值查找则通过查找值判定大概位于序列的哪个位置比例。

2、二分查找与插值查找的对比

  //begin表示数组开始下标,end表示数组结束下标,mid表示中间位置

 二分查找:int mid = (begin + end ) / 2;

 插值查找算法: int mid = begin + (end - begin) * (val - arr[begin]) / (arr[end] - arr[begin]);

  假设我们有1-100个数据,要查找的元素为:1,使用二分查找:

  ①:(0+99)/ 2 = 49

  ②:(0+49)/ 2 = 24

  ③:(0+24)/ 2 = 12

  ④:(0+12)/ 2 = 6

  ⑤:(0+6)/ 2 = 3

  ⑥:(0+3)/ 2 = 1

  ⑦:(0+1)/ 2 = 0

  使用插值查找算法:

  mid = 0 + (99 - 0)* (1 - 1)/ (99 - 1)

    = 99 * 0 / 99

    = 0

  可以看到使用插值查找算法只用了一次!

3、实现代码

  

public class Test04_插值查找算法 {
    public static void main(String[] args) {
        int[] arr = new int[100];
        for (int i = 0; i < 100; i++)
            arr[i] = i + 1;
        int indexVal = insertValueSearch(arr,1);
        System.out.println(indexVal==-1?"抱歉,没有找到该数据!":"您要找的元素下标为:"+indexVal+"");
    }

    public static int insertValueSearch(int[] arr, int val) {
        //开始元素以及结束元素下标
        int begin = 0;
        int end = arr.length - 1;
        //防止得到的元素下标越界
        if (begin > end || val < arr[begin] || val > arr[end])
            return -1;

        while (begin < end) {
            int mid = begin + (end - begin) * (val - arr[begin]) / (arr[end] - arr[begin]);
            if (val > arr[mid])//向右查找
                begin = mid + 1;
            else if (val < arr[mid])//向左查找
                end = mid - 1;
            else
                return mid;
        }
        return -1;
    }
}

4、注意

原文地址:https://www.cnblogs.com/zhangzhixi/p/13703095.html