插值查找

插值查找

基本思想

插值查找类似与二分查找,不同的是,插值查找每次从自适应mid处开始查找(即mid值取法不同),

插值查找中:mid= low + (key -arr[low]) * (height - low) / (arr[height] - arr[low])

求mid的公式图解

代码实现

/**
 * 二分查找,递归求解
 * 这里的递归实质上是可以使用while循环代替的,递归不产生回溯的情况下都是可以使用循环代替的
 *
 * @param arr:要查找的数组
 * @param key:要查找的值
 * @param left:左索引
 * @param right:右索引
 * @return:返回查找到值的下标
 */
public static int search(int[] arr, int key, int left, int right) {
    int l = left;
    int r = right;
    int mid = l + (key -arr[l]) * (r - l) / (arr[r] - arr[l]);//求出自适应mid
    int value = -1;
    //arr[l]>key || arr[r]<key此处这两个条件是不可以省略的,若传进来的key远远大于数组的最大值,则计算出来的mid将越界
    if (l <= r || arr[l] > key || arr[r] < key) {
        if (key < arr[mid]) {
            value = search(arr, key, left, mid - 1);
        } else if (key > arr[mid]) {
            value = search(arr, key, mid + 1, right);
        } else {
            value = mid;
        }
    }
    return value;
}

注意:

  1. 对于数量比较大,且关键字分布比较均匀的查找表来说,用插值查找算法比较快。
  2. 关键字分布不均匀,建议使用二分查找。

posted on 2021-05-05 21:44  凡人精灵  阅读(104)  评论(0编辑  收藏  举报

导航