数据结构与算法 之 插值查找

插值查找

插值查找,有序表的一种查找方式。插值查找是根据查找关键子与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率

插值查找: int mid = start + (end-start)*(targetValue-arr[start])/(arr[end]-arr[start]);
中间索引值 start表示数组的起始下标,end表示数组结束下标, targetValue表示要查找的数

利用自适应属性,让查找的值参与其中计算,估计要找的值得索引在哪,效率非常快
前提也是要查找的数组序列是有序的。

package com.wuzhixin.datastructrue;

import com.wuzhixin.test.Test;

/**
 * 吴志新
 * 2019/9/5-15:15
 * _23designpatterns
 **/
public class InsertValueSearch {
    public static void main(String[] args) {
        //int arr[] = new int[100];
       /* for (int i = 0; i < arr.length; i++) {
            arr[i]=i+1;
        }
*/
        int []arr = {1,8,10,89,1000,1000,1000,1234};

        int i = insertValueSearch(arr, 0, arr.length - 1, 1234);
        System.out.println("index = " + i);


    }

    public static int insertValueSearch(int arr[],int start,int end ,int targetValue){
        System.out.println("8888888888888888888888888888");
        if(start >= end || targetValue < arr[start] || targetValue > arr[end]){
            return -1;
        }
        // 自适应函数 算法
        int mid = start + (end-start)*(targetValue-arr[start])/(arr[end]-arr[start]);
        if(targetValue>arr[mid]){
           return insertValueSearch(arr,mid+1,end,targetValue);
        }else if(targetValue<arr[mid]){
           return insertValueSearch(arr,start,mid-1,targetValue);
        }else{
            return mid;
        }
    }
}

可以看到除了 求 中间索引的方式不一样,其他都是一样的

从下图中可以看到每次想查找 数组,找一次就可以找到 ,该算法适用于数据分布均匀的情况下使用,如果 左右两边的数据相差太大,可能效率并没有二分查找快
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值