002查找算法之插值查找

这篇文章是介绍插值查算法的,你可以获得如下知识:

  • 插值查找原理的
  • 插值查找的java代码实现
  • 建议这篇文章和查找算法001和起来看,不然你看不懂
  • 本文参考尚硅谷视频。

一、插值查找介绍

1、原因分析

为什么不是二分查找就可以了呢?
比如我们要找1-1000里面的1,如果我们要找的话,要二分,然后再二分,二分到最后都要很久,但是我们的插值查找的话,我们就利用自适应来完成时间减少。提高效率。

1、分析实现原理

  • 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。
  • 将二分查找中的mid索引的公式,low表示左边索引,high表示右边索引,key就是我们要查找的值。
    在这里插入图片描述
  • int midIndex = low + (high - low)* (key - arr[low])/ (arr[high] - arr[low]);插值的索引
  • 举例说明插值查找算法1-100的数组。
  • 另外可以参考这篇文章介绍的自适应算法:文章链接

2、看一下照片分析
在这里插入图片描述

二、代码实现

package cn.mldn;

public class InsertSelectValue {
    public static void main(String[] args) {
        //生成测试数组
        int[] arr = new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }
        System.out.println(InsertSelectValue(arr,0,arr.length - 1,100));
    }

    //插值查找,返回单个数据
    //插值查找要求数组也是有序的
    public static int InsertSelectValue(int[] arr,int left,int right,int findValue) {
        //findValue < arr[0] || findValue > arr[arr.length - 1]
            //这上面这两句话不要以为和二分查找一样啊,是不可以省略的。
        if (left > right || findValue < arr[0] || findValue > arr[arr.length - 1]) {//递归结束条件
            return -1;
        }

        //求出中间索引mid,这里是自适应算法。
        int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
        int midVal = arr[mid];
        if (findValue > midVal) {//findValue > midVal向右边递归
            return InsertSelectValue(arr,mid + 1,right,findValue);
        } else if (findValue < midVal) {//findValue < midVal向左边递归
            return InsertSelectValue(arr,left,mid - 1,findValue);
        } else {//说明找到了
            return mid;
        }
    }
}

三、其他的安排

1、作业

其他的可以实现返回多个的,各位可以参考我之前的二分查找,自己修改一下。

2、注意事项

  • 对于数据量较大时,关键字分布比较均匀的查找表来说,采取插值查找速度比较快。
  • 但是哦,但是,但是,数据分布不均匀的话,该方法是不一定比二分查找好的哦。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值