查找算法——插值查找算法

插值查找

  • 插值查找算法
    • 插值查找算法是二分查找的进化版,就是优化了二分查找算法。
    • 如果要查找的数组里有大量的元素,而这时需要查找的元素是第一个或者是最后一个,那么二分查找也需要耗费了一定的时间。
    • 原因就是mid值每次都是在中间,为了解决这个问题,对二分查找进行了优化。
  • 基本思想
    • 插值查找的思路与二分查找的思路相同,都是用的递归。但是的话插值查找要在确定中间值的时候使用的是自适应算法,就是通过这个自适应算法可以通过很少的次数来查找到该值。
    • 自适应算法是使用了需要查找的值来定位该值在整个数组里的位置,因此效率比较高
    • 自适应算法公式:mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
    • 插值查找比较适用于数组里元素比较连续的大量数据元素的查找,但是对于数组里的元素很分散的话,效果可能还不如二分查找。

代码实现

/**
 * @author Lu.F
 * @version 1.0
 * @date 2023/1/30 16:34
 */
public class InsertSearchDemo {

    public static void main(String[] args) {
        int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};
        System.out.println(insertSearch(arr, 0, arr.length - 1, 7));
    }

    /**
     * 插值算法,是二分查找算法的优化,可以快速定位第一个或者最后一个元素的位置,
     * 从而避免过多时间去查找
     * 自适应算法:
     * mid = left+(right-left)*(number-arr[left])/(arr[right]-arr[left])
     *
     * @param arr
     * @param left
     * @param right
     * @param number
     * @return
     */
    public static int insertSearch(int[] arr, int left, int right, int number) {
        // 限制,查找的数据不能小于最小或者大于数组中最大的数
        if (left > right || number < arr[left] || number > arr[right]) {
            return -1;
        }

        // 自适应算法的中间坐标
        int mid = left + (right - left) * (number - arr[left]) / (arr[right] - arr[left]);
        int val = arr[mid];
        // 大于则右递归
        if (number > val) {
            return insertSearch(arr, mid + 1, right, number);
        }// 小于则左递归
        else if (number < val) {
            return insertSearch(arr, left, mid - 1, number);
        }// 等于则结束,返回
        else {
            return mid;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值