首页 > 其他 > 详细

插值查找

时间:2021-05-06 09:53:57      阅读:24      评论:0      收藏:0      [点我收藏+]

插值查找

基本思想

插值查找类似与二分查找,不同的是,插值查找每次从自适应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. 关键字分布不均匀,建议使用二分查找。

插值查找

原文:https://www.cnblogs.com/ekig/p/14726373.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!