java实现插值查找

什么是插值查找

  • 插值查找,有序表的一种查找方式。
  • 插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率
  • 插值类似于平常查英文字典的方法,在查一个以字母C开头的英文单词时,决不会用二分查找,从字典的中间一页开始,因为知道它的大概位置是在字典的较前面的部分,因此可以从前面的某处查起,这就是插值查找的基本思想
  • 插值查找除要求查找表是顺序存储的有序表外,还要求数据元素的关键字在查找表中均匀分布,这样,就可以按比例插值。

思路分析

插值查找的实现和二分查找基本一致,唯一的区别就是查找点下标的选择。
在这里插入图片描述
其中,key为待查找关键字,low为待查找区间左端,high为待查找区间右端,mid为自适应查找点

  1. 计算mid
  2. 如果key==a[mid],返回mid
  3. 如果key>a[mid],进入右边区间继续查找
  4. 如果key<a[mid],进入左边区间继续查找

插值查找代码实现

/**
     * 插值查找(递归实现)
     *
     * @param arr  数组
     * @param low  待查找区间的左指针
     * @param high 待查找区间的右指针
     * @param key  待查找的关键字
     * @return 查找到的值的下标
     */
    public static int insertSearch(int[] arr, int low, int high, int key) {
        if (low > high) {
            return -1;
        }
        findCount++;
        // 根据待查找值key,计算出
        int mid = low +  (high - low) * (key - arr[low]) / (arr[high] - arr[low]);
        int midVal = arr[mid];
        if (key == midVal) {
            return mid;
        } else if (key > midVal) { // 到右边区域检索
            return insertSearch(arr, mid + 1, high, key);
        } else { // 到左边区域继续检索
            return insertSearch(arr, low, mid - 1, key);
        }
    }

注意事项

  • 插值查找适用于均匀分布的查找表
  • 对于分布不均匀的查找表,其不一定适用
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值