二十二、插值查找算法

一、插值算法的介绍

1)插值算法原理介绍

插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。

2)将折半查找中的求 mid 索引的公式 , low 表示左边索引 left, high 表示右边索引 right. key 就是要查找的值

在这里插入图片描述

3)int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/插值索引/

对应前面的代码公式: int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

4)举例说明插值查找算法 1-100 的数组

在这里插入图片描述

二、代码实现

package cn.zzw.algorithm.search;

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 index=insertValueSearch(arr,0,arr.length-1,1);
        System.out.println("index="+index);
    }

    /**
     *
     * @param arr
     * @param left  左边索引
     * @param right  右边索引
     * @param findVal  查找值
     * @return
     */
    public static int insertValueSearch(int[] arr,int left,int right,int findVal)
    {
    
    
        int count=0;
        System.out.println("插值查找的次数~"+(++count));
        //注意findVal<arr[0] ||findVal>arr[arr.length]这个判断条件是一定要写的
        //否则我们得到的mid可能越界
        if(left>right || findVal<arr[0] || findVal>arr[arr.length-1])
        {
    
    
            return -1;
        }

        int mid=left+(right-left)*(findVal-arr[left])/(arr[right]-arr[left]);
        int midValue=arr[mid];

        if (findVal>midValue)
        {
    
    
            //向右递归
            return insertValueSearch(arr,mid+1,right,findVal);
        }
        else if (findVal<midValue)
        {
    
    
            //向左递归
            return insertValueSearch(arr,left,mid-1,findVal);
        }
        else
        {
    
    
            return mid;
        }

    }
}

测试结果:

"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=29593:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.search.InsertValueSearch
插值查找的次数~1
index=0

Process finished with exit code 0

四、注意事项

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

  2. 关键字分布不均匀的情况下,该方法不一定比折半查找要好

    扫描二维码关注公众号,回复: 12675430 查看本文章

猜你喜欢

转载自blog.csdn.net/zhaozhiwei314/article/details/114239895