首页 > 编程语言 > 详细

插值查找算法详解

时间:2021-06-04 14:31:05      阅读:15      评论:0      收藏:0      [点我收藏+]

插值查找算法详解

说明

  1. 插值查找算法是二分查找算法的升级版,即优化算法,如果要查找的数组中有大量的数据,而要查找的数是第一个或者最后一个,那么二分查找也要耗费一定的时间,原因在于对Mid值的确定每次都是在中间,为了解决这个问题,对二分查找进行优化
  2. 插值查找思路与二分查找思路相同,都是使用递归的思想,但是插值查找在确定中间值midVal时使用自适应的算法,即让要查找的值对应的索引越发接近该索引对用在数组元素中的值,那么通过很少的次数就可以查找到该值
  3. 自适应算法主要是 使用要查找的值去定位该值在数组中的位置,因此效率较高
  4. 自适应算法求中间值公式: mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
  5. 插值查找适用于数组中元素较为连续的大量数据的元素的查找,但对于数组中元素太分散的元素的查找,效果可能不如二分查找,使用者应自行判断
  6. 详解见下

源码及详解

/**
     * 插值查找
     * 自适应查找算法
     *
     * @param arr       要查找的数组
     * @param left      左侧索引
     * @param right     右侧索引
     * @param findValue 要查找的值
     * @return 返回查找的结果
     */
    public static int insertValueSearch(int[] arr, int left, int right, int findValue) {
        System.out.println("hello");
        //递归结束条件之一 :没有找到要查找的值
        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];
        //如果要查找的值大于midVal,则在右边范围查找
        if (findValue > midVal) {
            return insertValueSearch(arr, mid + 1, right, findValue);
            //如果要查找的值xiao于midVal,则在左边范围查找
        } else if (findValue < midVal) {
            return insertValueSearch(arr, left, mid - 1, findValue);
        } else {
            //否则找到要查找的值直接返回
            return mid;
        }
    }

插值查找算法详解

原文:https://www.cnblogs.com/mx-info/p/14848943.html

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