【算法】插值查找算法

思想

  • 差值查找算法是对【算法】二分查找(折半查找)的一个优化。
  • 二分查找算法选取的是中间位置:mid = (low + high)/2
  • 插值查找算法选取的是自适应mid位置开始查找: mid= low + (key - a[low])(high - low)/(a[high] - a[low])

使用场景

  • 插值查找算法通过上面计算的mid,可以判断你要查找的位置大概在哪里,对于表较长,且关键字分布比较均匀时候,查找比较快。
  • 关键字分布不均匀的情况下,该方法不一定比折半查找要好

代码



public class Binary {
    public static int binarySearch(int[] arr,int left,int right,int findVal){
        // findVal  arr[arr.length -1] 
        // 防止mid越界
        if (left > right || findVal  arr[arr.length -1]){
            return -1;
        }
        // 二分查找
        // int mid = (left + right) /2;
        
        // 插值查找
        int mid = left + (right - left)*(findVal - arr[left])/(arr[right] - arr[left]);
        int midVal = arr[mid];

        if (findVal > midVal){
            return binarySearch(arr,mid + 1,right,findVal);
        }else if(findVal < midVal) {
            return binarySearch(arr,left,mid -1,findVal);
        }else {
            return mid;
        }
    }

    public static void main(String[] args) {
        int arr[] = {1,3,5,7,8,44,665};
        int mid = binarySearch(arr,0,arr.length-1,44);
        System.out.println(mid);
    }


}

问题:

如果代码中不加上这个判断 findVal arr[arr.length -1] ,mid很可能会越界,就会报如下异常: 

java.lang.ArrayIndexOutOfBoundsException

你可能感兴趣的:(算法)