差值查找算法

差值查找算法

思想

基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。如果要在取值范围1 ~ 10000 之间 100 个元素从小到大均匀分布的数组中查找5, 我们自然会考虑从数组下标较小的开始查找。关键点在于计算出查找点位置,二分查找是mid=(high-low)/2,简单暴力傻瓜式,差值查找算法的查找点计算方式为:
mid=low+(key-a[low])/(a[high]-a[low])*(high-low),

该公式的推导过程:(类似于黄金分割)
有公式可知,当比例大于1就不会存在查找列表中;
这个比例能帮助我们确定更精确的范围,减少查询次数。
在这里插入图片描述

应用场景:

必须基于有序的查找序列,对于目标数组量比较大,并且按照一定走势增长的,这样插值查找算法的效率是比较快的

java实现

 /**
     * 循环实现差值查找算法arr 已排好序的数组x 需要查找的数-1 无法查到数据
     */
    public static int differenceSearch(int[] arr, int x) {
        int low = 0;
        int high = arr.length - 1;
        while (low <= high) {
            int mid = low+(x-arr[low])/(arr[high]-arr[low])*(high-low);
            if (x == arr[mid]) {
                return mid;
            } else if (x < arr[mid]) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }

    /**
     * 递归实现差值查找
     */
    public static int differenceSearch(int[] array, int queryData, int startIndex, int endIndex) {
        int midIndex = startIndex+(queryData-array[startIndex])/(array[endIndex]-array[startIndex])*(endIndex-startIndex);
        if (queryData < array[startIndex] || queryData > array[endIndex] || startIndex > endIndex) {
            return -1;
        }
        if (queryData < array[midIndex]) {
            return binarySearch(array, queryData, startIndex, midIndex - 1);
        } else if (queryData > array[midIndex]) {
            return binarySearch(array, queryData, midIndex + 1, endIndex);
        } else {
            return midIndex;
        }
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值