(十八)查找算法——插值查找

时间:2021-07-14
本文章向大家介绍(十八)查找算法——插值查找,主要包括(十八)查找算法——插值查找使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
  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 的数组

1.插值查找应用案例:

请对一个有序数组进行插值查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

  • 代码实现
/**
 * 插值查找
 */
public class InsertValueSearch {

    public static void main(String[] args) {

        //int[] arr = {1, 8, 10, 89, 1000, 1234};
        int[] arr = {1, 2, 3, 4, 5, 6};
        int index = insertValueSearch(arr, 0, arr.length - 1, 3);
        System.out.println("index:" + index);
    }

    /**
     * 插值查找
     *
     * @param arr
     * @param left
     * @param right
     * @param findValue
     * @return
     */
    public static int insertValueSearch(int[] arr, int left, int right, int findValue) {
        System.out.println("search");
        if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) {
            return -1;
        }
        //公式
        int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
        if (findValue > arr[mid]) {
            //向右边找
            return insertValueSearch(arr, mid + 1, right, findValue);
        } else if (findValue < arr[mid]) {
            //向左边找
            return insertValueSearch(arr, left, mid - 1, findValue);
        } else {
            return mid;
        }
    }
}

2.插值查找注意事项:

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

原文地址:https://www.cnblogs.com/everyingo/p/15009568.html