7-2插值查找

插值查找

算法介绍

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

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

1621318347174

  1. int midIndex = low + (high - low) * (key - arr[|ow])/ (ar[high]- arr[|ow]) ; /* 插值索引 */

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

*算法原理

在二分查找的基础上进一步的约束数据,要求数据是有序且数值分布均匀的,可以获得更加高效的“插值查找”算法 

​ 所以,可以改变二分查找的区间缩减策略,根据搜索的值来确定区间缩减幅度,使其不再是固定的1/2,这种想法就是“插值查找”,其中间位置计算方式如下:

img

​ 如果alpha用于衡量搜索目标值距离左边界的远近,就可以使用下述公式进行表达,其中tar(key)表示目标值,D(arr)表述有序数值:

img

​ 此时,如果目标值tar和左边界值D[left]差的多,则中间位置mid更靠右;如果目标值tar和左边界值差的少,则中间位置mid更靠左。也就是说,插值查找算法的中间位置mid不是真的在中间了,而是根据目标值和边界值的关系动态的确定

​ 插值查找算法和二分查找算法的区别主要就在于中间位置mid的确定,它们在终止条件和判断条件上都是相同,在此不做重复。

图解

1621318673062

代码实现

package com.company.search;

/**
 * @Function :
 * date 2021/5/18 - 14:18
 * How :
 */
public class InserValueSearch {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        int index = inserValueSearch(arr,8);
        System.out.println(index);
    }

    public static int inserValueSearch(int srcArray[], int key) {
        int start = 0;
        int end = srcArray.length - 1;
        int mid = start+(end-start)*(key-srcArray[start])/(srcArray[end]-srcArray[start]);

        while (start <= end) {
            mid = (end - start) / 2 + start;
            if (key == srcArray[mid]){
                return mid+1;
            }
            if (key < srcArray[mid]) {
                end = mid - 1;
            }
            if (key > srcArray[mid]) {
                start = mid + 1;
            }
        }
        return -1;
    }
}


posted @ 2021-11-23 21:16  剪水行舟  阅读(58)  评论(0)    收藏  举报