Java数据结构与算法之插值查找解析

 更新时间:2023年12月18日 09:34:41   作者:暴躁的程序猿啊  
这篇文章主要介绍了Java数据结构与算法之插值查找解析,插值查找算法类似于二分查找,不同的就是插值查找每次从自适应mid处开始查找,需要的朋友可以参考下

插值查找算法

1.插值查找算法类似于二分查找,不同的就是插值查找每次从自适应mid处开始查找,例如我们要从{1,8,10,89,1000,1024}找1这个数,那我们就会从前边开始找,插值查找就是应用这种原理;

2.将折半查找中的求mid索引的公式,low表示左边索引,high表示右边索引

int midIndex=low+(high-low)*(key-arr[low])/(arr[high]-arr[low]);

代码实现

/**
 * 插值查找算法
 *
 * @create: 2021/10/4
 * @author: Tony Stark
 */
public class InsertValueSearch {
    public static void main(String[] args) {
        int[] arr = new int[100];
        //循环赋值
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }
        int i = insertValueSearch(arr, 0, arr.length - 1, 100);
        System.out.println(i);
//        System.out.println(Arrays.toString(arr));
    }
    /**
     * 插值查找算法
     *
     * @param arr     查找的数组
     * @param left    左边的索引
     * @param right   右边的索引
     * @param findVal 查找的值
     * @return 如果找到返回对应的下标 ,  没有找到返回-1
     */
    public static int insertValueSearch(int[] arr, int left, int right, int findVal) {
        //判断 如果左边的索引大于右边索引  查找的值小于最小的值 查找的值大于最大的值
        //就退出    条件findVal<arr[0]||findVal>arr[arr.length-1]必须有 否则可能越界
        if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
            return -1;
        }
        //求出mid
        int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
        //找到中间的值
        int midVal = arr[mid];
        if (findVal > midVal) {
            //如果查找的值大于定位到的midVal值说明应该向右边递归
            return insertValueSearch(arr, mid + 1, right, findVal);
        } else if (findVal < midVal) {
            //如果查找的值小于定位到的midVal值说明应该向左边递归
            return insertValueSearch(arr, left, mid - 1, findVal);
        } else {
            //找到返回mid下标
            return mid;
        }
    }
}

输出

99

插值查找注意事项:

1.对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快

2.关键字分布不均匀的情况(数据跳跃很大)下该方法不一定比折半方法好

到此这篇关于Java数据结构与算法之插值查找解析的文章就介绍到这了,更多相关Java插值查找内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java一致性Hash算法的实现详解

    Java一致性Hash算法的实现详解

    这篇文章主要介绍了Java一致性Hash算法的实现详解,hash的意思是散列,目的将一组输入的数据均匀的分开、打散,往往用来配合路由算法做负载均衡,多用在分布式系统中,需要的朋友可以参考下
    2024-01-01
  • java并发编程工具类PriorityBlockingQueue优先级队列

    java并发编程工具类PriorityBlockingQueue优先级队列

    这篇文章主要为大家介绍了java并发编程工具类PriorityBlockingQueue优先级队列的方法示例应用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Java实现产生随机字符串主键的UUID工具类

    Java实现产生随机字符串主键的UUID工具类

    这篇文章主要介绍了Java实现产生随机字符串主键的UUID工具类,涉及java随机数与字符串遍历、转换等相关操作技巧,需要的朋友可以参考下
    2017-10-10
  • springboot bean循环依赖实现以及源码分析

    springboot bean循环依赖实现以及源码分析

    最近在使用Springboot做项目的时候,遇到了一个循环依赖的 问题,所以下面这篇文章主要给大家介绍了关于springboot bean循环依赖实现以及源码分析的相关资料,需要的朋友可以参考下
    2021-06-06
  • SpringBoot如何访问不同的数据库的方法实现

    SpringBoot如何访问不同的数据库的方法实现

    本文主要介绍了在SpringBoot应用中配置和管理多个数据源的方法,包括使用SpringBoot官方支持的配置方式和第三方库实现多数据源配置,感兴趣的可以了解一下
    2024-11-11
  • 微信小程序录音文件格式silk遇到的问题及解决方法

    微信小程序录音文件格式silk遇到的问题及解决方法

    录音文件为silk格式,说是silk其实是base64加密后的webm格式,只需将其转为webm格式即可。但是在处理过程中遇到各种坑,下面小编给大家带来了微信小程序录音文件格式silk遇到的问题及解决方法,感兴趣的朋友一起看看吧
    2018-09-09
  • 深度思考JDK8中日期类型该如何使用详解

    深度思考JDK8中日期类型该如何使用详解

    这篇文章主要介绍了JDK8中日期类型该如何使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java程序执行过程及内存机制详解

    Java程序执行过程及内存机制详解

    本讲将介绍Java代码是如何一步步运行起来的,还会介绍Java程序所占用的内存是被如何管理的:堆、栈和方法区都各自负责存储哪些内容,感兴趣的朋友跟随小编一起看看吧
    2020-12-12
  • Springboot整合JwtHelper实现非对称加密

    Springboot整合JwtHelper实现非对称加密

    本文主要介绍了Springboot整合JwtHelper实现非对称加密,主要介绍两种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03
  • Spring Boot如何通过java -jar启动

    Spring Boot如何通过java -jar启动

    大家开发的基于Spring Boot 的应用 ,jar形式, 发布的时候,绝大部分都是使用java -jar 启动。本文主要介绍了Spring Boot如何通过java -jar启动,一起来了解一下
    2021-05-05

最新评论