首页 > 编程语言 >插值查找算法

插值查找算法

时间:2022-11-07 20:45:36浏览次数:45  
标签:arr 插值 findVal int 算法 查找 left

插值查找算法

  1. 插值查找原理介绍:

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

2.将折半查找中的求 mid 索引的公式 , low 表示左边索引 left, high 表示右边索引 right. key 就是前面我们讲的 findVal

image-20221107192040695

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

​ 对应前面的代码公式:

​ int mid = left + (right – left) * (findVal – arr[left]) / (arr[right] – arr[left])

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

image-20221107192215592

举例

请对一个有序数组进行插值查找{1,8, 10, 89, 1000, 1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。

核心代码:

 //编写插值查找算法
    //说明:插值查找算法,也要求数组是有序的
    /**
     *
     * @param arr 数组
     * @param left 左边索引
     * @param right 右边索引
     * @param findVal 查找值
     * @return 如果找到,就返回对应的下标,如果没有找到,返回-1
     */
    public static int insertValueSearch(int[] arr, int left, int right, int findVal) {

        //注意:findVal < arr[0]  和  findVal > arr[arr.length - 1] 必须需要
        //否则我们得到的 mid 可能越界
        if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
            return -1;
        }

        // 求出mid, 自适应
        int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
        int midVal = arr[mid];
        if (findVal > midVal) { // 说明应该向右边递归
            return insertValueSearch(arr, mid + 1, right, findVal);
        } else if (findVal < midVal) { // 说明向左递归查找
            return insertValueSearch(arr, left, mid - 1, findVal);
        } else {
            return mid;
        }
    }

主程序代码

public static void main(String[] args) {

        int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };

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

    }

运行结果:

image-20221107192800885

注意事项:

1.对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快.

2.关键字分布不均匀的情况下,该方法不一定比折半查找要好

这篇博客是我在B站看韩顺平老师数据结构和算法的课时的笔记,记录一下,防止忘记,也希望能帮助各位朋友。

标签:arr,插值,findVal,int,算法,查找,left
From: https://www.cnblogs.com/malinyan/p/insertValueSearch.html

相关文章

  • windbg中通过文件句柄查找设备(!handle/!fileobj/!devobj命令)
      有时,在驱动程序中会调用ZwCreateFile获得设备句柄,然后保存在设备扩展区域中供其他例程使用。由于驱动程序经常被动调用----执行的上下文可能不是同一个线程----会获得......
  • 【python】机器学习算法(KNN)入门——手写数字识别
    前言嗨喽~大家好呀,这里是魔王呐!最近邻(kNearestNeighbors,KNN)算法是一种分类算法1968年由Cover和Hart提出,应用场景有宁符识别、文本分类、图像识别等领域。手......
  • 二分查找
    二分查找:请对一个有序数组进行二分查找{1,8,10,89,1000,1234},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。二分查找思路二分查......
  • C/C++算法从菜鸟到达人
    "IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台,致力于帮助读者在广义的IT领域里,掌握更专业、实用的知识与技能,快速提升职场竞争力。今天为您推荐一本精品图书--C/C++......
  • STL相关常用算法总结
    头文件:#include<algorithm>1.常用遍历算法:for_each(v.begin(),v.end(),myPrint);void myPrint(intval){returnval;} 2.常用拷贝和替换算法:copy(v.begi......
  • 【数据结构-链表】链表的相关算法
    目录1删除元素1.1删除值为x的所有结点1.1.1不带头结点的单链表1.1.2带头结点的单链表1.2删除重复元素1.2.1不带头结点的单链有序表1.2.2带头结点的单链有序表2链......
  • 基础算法篇——双指针算法
    基础算法篇——双指针算法本次我们介绍基础算法中的双指针算法,我们会从下面几个角度来介绍:双指针简介双指针基本使用最长连续不重复字符列数组元素的目标和判断子序......
  • 粒子群算法
    一种智能算法,其思想就是在一个粒子群中,利用历史最优和当前种群的最优值来在一定程度上影响当前种群的决策对于每个粒子,有2个参数:位置X和速度V每次更新:X=X+V;V=V+r......
  • 扩展欧几里得算法
    题目:#include<bits/stdc++.h>usingnamespacestd;intexgcd(inta,intb,int&x,int&y){if(b==0){x=1,y=0;returna;}intx1,y1......
  • 数据机构 最小生成树(Prim算法(普里姆、Kruskal算法( 克鲁斯卡尔))
    8.8、最小生成树连通图的生成树是包含图中全部顶点的一个极小连通子图;若图中顶点数为n,则它的生成树含有\(n-1\)条边。最小生成树对于一个带权连通无向图G=(V,E),生成树......