其他分享
首页 > 其他分享> > 【数算-16】插值查找

【数算-16】插值查找

作者:互联网

文章目录

1、算法思想

在这里插入图片描述

2、问题描述

在这里插入图片描述

3、代码实现

在这里插入图片描述

注:这里将插值查找算法实现为能返回多个下标的集合

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhihua.li
 * @date 2021/2/7 - 21:45
 * 插值查找算法
 **/


public class InsertValueSearch {

    /**
     * @param arr    待查找数组
     * @param left   左侧索引
     * @param right  右侧索引
     * @param target 待查找目标值
     * @return
     * @Method insertValueSearch
     * @Author zhihua.Li
     * @Version 1.0
     * @Description 针对要查找的值在待查找有序数组中包含多个时,需要返回多个下标
     * 插值查找相较于二分查找而言:
     *      通过自适应式获取mid值(将目标值带入到求mid值公式中)能较快的查找到目标元素所在位置
     *      对于数据量较大,关键字分布较均匀(跳跃性较小)的查找表来说,速度较快
     *      关键字分布不均匀(跳跃性较大)时不一定比折半查找好
     * @Return List<Integer>   返回下标集合
     * @Exception
     * @Date 2021/2/7 8:16
     */

    private List<Integer> insertValueSearch(int[] arr, int left, int right, int target) {
        System.out.println("~~~");
//        在left>righ的基础上添加了后两个判断条件,避免因目标值过大或过小而一直查找到最后的问题
        if (left > right ) {
            return null;
        }
        int mid = left + (right - left) * (target - arr[left]) / (arr[right] - arr[left]);
        int midValue = arr[mid];
        List<Integer> resIndexList = new ArrayList<>();

        if (target < midValue) {
            return insertValueSearch(arr, left, mid - 1, target);
        } else if (target > midValue) {
            return insertValueSearch(arr, mid + 1, right, target);
        } else {
            int temp = mid - 1;
            while (true) {
                if (temp < 0 || arr[temp] != target) {
                    break;
                }
                resIndexList.add(temp);
                temp--;
            }
            resIndexList.add(mid);
            temp = mid + 1;
            while (true) {
                if (temp > arr.length - 1 || arr[temp] != target) {
                    break;
                }
                resIndexList.add(temp);
                temp++;
            }
            return resIndexList;
        }
    }
 }

4、测试与分析

@Test
    public void test() {
        int arr[] = {1, 8, 10, 89, 1000, 1000, 1234};
        System.out.println(insertValueSearch(arr, 0, arr.length - 1, 1000));
    }

在这里插入图片描述

5、插值查找的适用场景

在这里插入图片描述

标签:arr,数算,temp,16,插值,mid,查找,left,target
来源: https://blog.csdn.net/weixin_45729934/article/details/113773655