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

MATLAB编程实战:通过SCPI命令高效读取普源示波器数据 本文详细介绍了如何利用MATLAB通过SCPI命令高效读取普源示波器数据,实现自动化测试与数据分析。文章从硬件连接到软件配置,再到核心代码编写与数据解析,提供了完整的实战指南,帮助工程师和科研人员摆脱手动操作,直接从示波器内存中精准读取数据,并利用MATLAB进行FFT频谱分析,大幅提升工作效率。 阅读详情

插值查找

在学习数据结构与算法的过程中,知道了一种查找算法叫“插值查找”,我们可以将其理解为是“二分查找”的改良版。

二分查找:
mid = (left + right) /2 = left + 1/2 * right
插值查找:
mid = left + ((target - a[left]) / (a[right] - a[left])) * (right - left)
    = left * ((a[right] - target) / (a[right] - a[left])) + right * ((target - a[left]) / (a[right] - a[left]))

我一开始在想,插值查找的这个公式到底是怎么来的呀,于是就去网上一搜,好家伙,背后居然有一大串数学原理。

我看了好久,愣是没摸透!!!果然,编程的尽头就是数学hhh

虽然,不能完全搞懂公式的来源,但是慢慢啃,还是能慢慢理解的。

我在这里就不用什么数学去解释(因为我没懂),我就”形象地“理解一下这个公式。

在这里插入图片描述

最后,再记录一下“插值查找”的代码实现。

package edu.zhku.search;

import java.util.Arrays;

/**
 * @author Zhang
 * @date 2022/3/27 15:48
 * @description 插值查找
 * 插值查找算法类似于二分查找,可以视为二分查找的改进版,不同的是插值查找每次从自适应 mid 处开始查找。
 * 二分查找:mid = (left + right) /2 = left + 1/2 * right
 * 插值查找:
 * mid = left + ((target - a[left]) / (a[right] - a[left])) * (right - left)
 *     = left * ((a[right] - target) / (a[right] - a[left])) + right * ((target - a[left]) / (a[right] - a[left]))
 */
public class InsertValueSearch {
    public static void main(String[] args) {

        int[] arr = new int[100];
        for (int i = 0; i < 100; i++) {
            arr[i] = i + 1;
        }
        System.out.println(Arrays.toString(arr));
        int index = insertValueSearch(arr, 0, arr.length - 1, 99);
        System.out.println(index);
    }

    /**
     * 二分查找法
     *
     * @param arr    原始数组
     * @param left   左端点
     * @param right  右端点
     * @param target 目标值
     * @return 存在,返回其索引值;不存在,返回-1
     */
    public static int insertValueSearch(int[] arr, int left, int right, int target) {
        /*
         * 此处和二分查找略有不同
         * 还必须判断:target < arr[0] 和 target > arr[arr.length-1]
         * 保证 mid 不越界
         */
        if (left > right || target < arr[0] || target > arr[arr.length - 1]) {
            return -1;
        }
        //mid,自适应
        //int mid = left + (target - arr[left]) / (arr[right] - arr[left]) * (right - left);
        int mid = left + (right - left) * (target - arr[left]) / (arr[right] - arr[left]);
        int midVal = arr[mid];
        if (target > midVal) {
            //目标值在mid右边
            return insertValueSearch(arr, mid + 1, left, target);
        } else if (target < midVal) {
            //目标值在mid左边
            return insertValueSearch(arr, left, mid - 1, target);
        } else {
            return mid;
        }
    }
}

好了,就说到这吧,我发现数据结构与算法的学习过程还是挺有趣的,尽管确实痛苦。其实写这个博客只是为了让自己去记住这个式子。

最后,我当时是看了这篇文章https://zhuanlan.zhihu.com/p/133535431,给我启发挺大的。


二相混合式步进电机闭环矢量控制simulink仿真(含仿真文件) 在位置跟踪伺服系统中二相混合式步进电机闭环矢量控制simulink仿真 阅读详情

相关推荐

避开这些坑!SOEM控制伺服电机时PDO配置与状态机处理的常见误区

本文深入探讨了使用SOEM控制伺服电机时PDO配置与状态机处理的常见误区,提供了详细的避坑指南。从SyncManager配置顺序到状态字位掩码应用,再到网络同步优化,帮助开发者避免通信失败和系统不稳定问题,提升工业自动化项目的可靠性。

chongtai6075的博客 482

插值查找的公式推导

插值查找的数学逻辑来自于基于二分查找算法,将查找点的选择改进为自使用选择,可以提高查找效率对于表长较长,而关键字分布又比较的查找表而言,插值查找算法的平均性能要不二分查找好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择插值查找的的代码跟二分查找的类似,只需要修改一下mid的计算方式即可二分查找中mid的查找公式是midlow1/2∗high−low;这个公式就是简单的确定中间值而插值查找中的mid的查找公式是midlowkey−a。

时刻总结 425

STM32+W5500实战:5分钟搞定FreeModbus TCP移植(附完整代码)

本文详细介绍了如何在STM32微控制器上,结合W5500以太网芯片,快速完成FreeModbus TCP协议栈的移植,构建稳定可靠的工业级Modbus TCP服务器。内容涵盖硬件连接、软件架构、驱动适配、核心移植代码实现及调试优化技巧,旨在提供可直接应用于实际项目的完整解决方案。

life6的博客 878

插值查找公式推导

首先看二分查找的mid = (high+low)/2,可进行变形mid=low+(high-low)/2。 再看插值查找的mid=low+(high-low)*(key-arr[low])/(arr[high]-arr[low])。 细看是不是只是用key在整序列中的占比来代替原来固定的1/2呢 代码和折半查找一模一样,唯独mid的计算方式发生改变。这样的好处在于,对表长较长,且关键字分分布比较均匀,插值查找算法的平均性能要比折半查找要好的多。但是如果表中关键字分布极端不均匀那么插值查找还不如折半查找

Error的博客 959

【NAS for PVE _04】安装TrueNAS

前篇说到如何调试 Proxmox VE 8.2 为安装虚拟机做准备,本篇主要讲述如何在 Proxmox VE 上安装 TrueNAS 系统,并开启NFS供其他系统挂载使用官网下载好TrueNAS系统镜像。

村口王师傅。 6143

【工具】GitHub学生认证+PyCharm配置Copilot全流程指南

本文提供了一份详细的GitHub学生认证及在PyCharm中配置Copilot的完整指南。通过完成A2F认证、准备有效材料并使用干净网络环境,学生可免费获取GitHub Copilot Pro订阅,极大提升编程学习与开发效率。

w7x8y9z的博客 1456

插值查找(两种方法)

一、什么是插值查找 (1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。 (2)二分查找中mid值是left和right所指序列下标的和的1/2即 mid = (left+right)/ 2。 (3)而插值查找的mid 值是通过公式计算得来由,由公式可以明显看出mid的值并非像二分那样为左右索引的中间位置。 (4)插值查找公式;3、int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[lo

qq_52253798的博客 5117

2026年【江苏“信息与未来”编程思维】真题及题解(T6:桌面游戏)

2026年【江苏“信息与未来”编程思维】真题及题解(T6:桌面游戏)

王老师青少年编程 532

插值查找算法

插值查找算法 1.插值查找原理介绍: 1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。 2)将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right.key 就是前面我们讲的 findVal。 3)int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ; 插值索引对应的代码公式:int mid = left + (right – lef

xiaoshiguang3的博客 934

c++篇 cad.arx Win10环境配置vs2019+arx2021多版本配置+vs2022 配置图

msvc v141 v140这个两个好像是编译vs2015 vs2017版本的,必须装,然后v142装最新的,剩下的有些是默认的,还有就是mfc这些恐怕要装,然后是v140v141这两个版本的windows sdk是8.1,需要单独装一下。Windows SDK version 8.1 下载地址。windows sdk是10.0.19041.0。先安装vs2019,如图。

我的博客 781

【深度学习新浪潮】Score Matching(分数匹配):原理、推导与PyTorch实战

在概率模型训练中,配分函数(归一化常数)是绕不开的难题——尤其是能量模型(EBM)、扩散模型等未归一化模型,直接计算配分函数几乎不可能。Score Matching(分数匹配)作为一种无归一化的参数估计方法,通过拟合概率密度的对数梯度(分数函数),彻底避开了配分函数的计算,成为生成建模、密度估计的核心技术之一。本文将从基础概念出发,逐步推导Score Matching的核心公式,并结合PyTorch实现一个可直接运行的实战案例,帮你彻底理解这一关键技术。Score Matching的核心是。

专注:太空算力、AI infra、异构调度、大模型成本工程 250

【Java数据结构与算法】基础篇(5):常用的查找算法:二分查找、插值查找、斐波那契查找

java中,我们常用的查找算法有四种: ① 顺序(线性)查找 ② 二分查找/折半查找 ③ 插值查找 ④ 斐波那契查找

qq_44366571的博客 266

YOLOv11 损失函数进阶:SlideLoss 让小目标检测精度飙升

创建self.loss_fun = loss_fun # 基础损失函数(如BCEWithLogitsLoss)self.loss_coef = loss_coef # 损失系数# 计算滑动权重:根据预测与真实值的差异判断样本难度# 难度越高,权重越大该类在原有损失函数的基础上,通过diff计算样本预测与真实值的差异(差异越大,样本越难),进而生成动态权重,实现对难样本的重点学习。

m0_64661770的博客 209

【数据结构与算法】【查找】插值查找的代码实现

插值查找(Interpolation Search):是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值的计算公式。 插值计算公式:(key - a[low]) / (a[high] - a[low]) mid计算公式:mid = low + (high - low) * (key - a[low]) / (a[high] - a[low]);

木名的专栏 910

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据结构与算法 查找算法(线性查找,二分查找,插值查找,斐波那契查找) 附有详细流程分析图!

工具:IDEA本篇介绍查找算法:重点:线性查找比较简单,就算刚入门也应该会,直接看代码了! 使用: 优缺点分析 优点:缺点:重点:寻找数组必须有序一半一半的找指针记录这里的指针和C中的指针不同这里的指针可以理解为下标,就是找一个临时的数来记录当前位置二分查找只需要3个指针每次值和做比较如果需要寻找的元素 > 中间位置 ,说明 在中间指针右边所以需要将 开始指针 = 中间指针 + 1如果 < 中间位置 ,说明在中间指针左侧所以需要将 结束指针 = 中间指针最终需要找的元素和当前元素相同时候,说明找到了该

高级开发者进阶ing... QaQ 1061

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【数据结构与算法 12】二分查找、插值查找、斐波那契查找

一、前言 查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如在编译程序中符号表的查找。 本文简单介绍二分查找、插值查找、斐波那契查找。 查找算法分类: 1、静态查找和动态查找 2、无序查找和有序查找 二、二分查找 1、基本思想 也称为折半查找,属于有序查找算法。用给定值value先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等,则查找成功;若不相等,再根据K与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束

学Java,找哪吒 5129

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

插值查找是一种针对排序好的数值型数组进行搜索的算法,它通过对数组元素的线性分布特性进行估计,计算待查找目标值可能所在的位置,从而减少查找次数,提高查找效率。不同于二分查找每次都从中间位置开始比较,插值查找每次都将根据目标值和当前数组范围内的元素分布情况进行预测性的跳跃查找。插值查找作为一种基于数值分布特性的查找算法,对于特定类型的数据结构和数据分布有着卓越的性能表现。理解并掌握插值查找不仅有助于我们丰富查找算法的知识体系,还能在特定条件下提供更优的解决方案。

m0_62988332的博客 1080

数据结构: 插值查找算法

import java.util.Arrays; // 插值查找算法,也要求数组是有序的 public class InsertValueSearch { public static void main(String[] args) { int[] arr = {2, 4, 5,6, 8,9, 10, 12, 14, 17, 18, 19,20}; ...

m0_37564426的博客 336

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

插值查找 插值查找,有序表的一种查找方式。插值查找是根据查找关键子与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率 插值查找: int mid = start + (end-start)*(targetValue-arr[start])/(arr[end]-arr[start]); 中间索引值 start表示数组的起始下标,en...

wzx01234567890的博客 241

数据结构与算法 - 二分查找优化:插值查找与斐波那契查找

摘要 本文探讨了两种优化二分查找的算法:插值查找和斐波那契查找。插值查找通过插值公式预测目标位置,在数据均匀分布时可达O(log log n)时间复杂度,但可能退化到O(n);斐波那契查找利用黄金分割原理,保持稳定O(log n)复杂度,适合非均匀数据。文章首先回顾了二分查找的基本思想(O(log n)时间复杂度),然后详细介绍了这两种优化算法的核心原理、实现代码、时间复杂度分析及适用场景。通过比较不同算法的特点,帮助开发者根据数据特性选择最优查找策略,提升检索效率。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

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

前言 最近面临毕业就业,在复习数据结构与算法,为了更好地掌握,加深印象,所以决定写一些博客来知识复现。 温馨提示:这篇博客可能不适合刚学数据结构的新手。 算法的简单介绍 插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。 插值查找算法跟二分查找算法一样,也要求数组是有序的。 代码实现 package sjjg; public class InsertValueSearch { public static void main(String[] args) { //

iCanCode的博客 232

数据结构与算法——插值查找算法实现

插值查找算法 与二分查找的不同点 原理:int mid = (high-low) / 2;//二分查找 int mid = (high - low) * (findVal - arr[low]) / (arr[high] - arr[low]);//插值查找 至于为什么这个公试会比较快,欢迎*大的朋友给我上上课 算法实现 public class InsertValueSearchDe...

qq_38099207的博客 349

算法与数据结构——插值查找(c/c++实现)

插值查找算法算法原理算法代码(简易)优缺点 算法原理 算法基于二分查找(binary search) 演变而成,拥有二分查找时间复制度小的优点,而思想也几乎是继承了二分查找。 相比 斐波那契查找 ,插值查找一样有特殊的middle选取方式: 该公式即为middle点的选取方式,而在 key < A[middle] 时则将high取为middle - 1,这点与二分查找同理,key > A[middle]时则同理将 low 取为 middle + 1 但这有一个问题,在清华大学邓老师的课中有一个

glassesone的博客 1676

数据结构与算法——Java实现查找算法—斐波那契查找、插值查找、线性查找

注意, 此时斐波那契数列是存放在数组中的, 所以会用F[]表示, 一定要注意跟F()的不同, 比如: F[6] =13 = F(7), F[0] = 1 = F(1)与二分查找法、插值查找法相似,仅仅改变了中间节点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近。斐波那契数列{1,1,2,3,5,8,13,21,34,55}发现斐波那契数列的。, 说明你要查找的数在mid 的右边, 因此需要递归的向右查找。, 说明你要查找的数在mid 的左边, 因此需要递归的向左查找。

weixin_51351637的博客 811

Java数据结构和算法之插值查找

实现原理: 和二分查找的原理大概相同,不一样的是mid的获得方式不同。 mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]) 代码如下: package com.guigu.search; import java.util.Arrays; public class InsertValue...

qq_43437122的博客 142

数据结构与算法——查找算法(顺序查找,二分查找,插值查找,斐波那契查找)

查找算法 下列五种查找算法,除顺序查找外,其他算法的思路基本相同: 先对数据按某种方法进行排序,然后使用相应的规则查找。 因此,搞清排序算法才是关键。 1. 顺序查找 顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。 条件:无序或有序队列。 原理:按顺序比较每个元素,直到找到关键字为止。 时间复杂度:O(n) /** * 顺序查找 返回其索引值。 */ p

nswdiphone6的博客 1455
上一篇: 计算机基础——浮点数的小细节
下一篇: LeetCode_链表_环形链表_141
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窝在角落里学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值