c++ 插值搜索与二分搜索

        插值搜索和二分搜索都是在有序数组中查找目标元素的算法。它们之间的核心区别在于确定中间元素的方式。
        1、二分搜索(Binary Search):二分搜索是一种通过将目标值与数组中间元素进行比较,然后根据比较结果缩小搜索范围的算法。如果中间元素等于目标值,则找到目标;如果中间元素大于目标值,则在左半部分继续搜索;如果中间元素小于目标值,则在右半部分继续搜索。这样不断缩小搜索范围,直到找到目标或确定目标不存在。
        2、插值搜索(Interpolation Search):插值搜索是一种根据目标值在已知范围内的分布情况,预测目标值应该在的位置,然后进行搜索的算法。通过计算估计的位置(插值位置),然后进行比较,再根据比较结果缩小搜索范围。插值搜索通常在数据元素分布比较均匀的情况下效果更好,能比二分搜索更快地收敛到目标值。

        经过定义理解,二分搜索是通过比较中间元素来划分搜索范围,每次将搜索范围缩小一半;插值搜索是通过估计目标值在数组中的位置,根据估计位置缩小搜索范围。插值搜索在数据分布比较均匀且连续的情况下可能更快,但在非均匀或者不连续的情况下可能不如二分搜索。

对于有序且均匀分布的数组,插值搜索比二分搜索效果更好。 

        无论搜索键如何,二分搜索都会转到中间元素进行检查。另一方面,插值搜索可以根据搜索关键字去不同的位置。如果搜索键的值接近最后一个元素,则插值搜索可能会向末尾开始搜索。

        插值搜索和二分搜索都是用于在排序列表或数组中搜索特定元素的算法。两种算法的平均时间复杂度均为 O(log n),这意味着执行搜索所需的时间随着列表的大小呈对数增长。

但是,插值搜索和二分搜索之间存在一些关键区别:

        插值搜索根据目标元素周围元素的值来估计目标元素的位置,而二分搜索总是从检查列表的中间元素开始。

        当列表中的元素均匀分布时,插值搜索比二分搜索更有效,而当列表中的元素不均匀分布时,二分搜索更有效。

        插值搜索可能比二分搜索需要更长的时间来实现,因为它需要使用额外的计算来估计目标元素的位置。

例子 : 
#include<bits/stdc++.h>
using namespace std;
 
int interpolation_search(int arr[],int target, int n){
    int low = 0;
    int high = n - 1;
 
    while (low <= high && target >= arr[low] && target <= arr[high]){
        // Calculate the position of the target element based on its value
        int pos = low + (((target - arr[low]) * (high - low)) / (arr[high] - arr[low]));
 
         // Check if the target element is at the calculated position
        if( arr[pos] == target){
            return pos;
        }
 
        // If the target element is less than the element at the calculated position, search the left half of the list
        if(arr[pos] > target){
            high = pos - 1;
        }
        else{
            // If the target element is greater than the element at the calculated position, search the right half of the list
            low = pos + 1;
        }
    }
    return -1;
}
 
int main(){
     
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    int n = sizeof(arr)/sizeof(int);
    int target = 5;
    int index = interpolation_search(arr, target, n);
     
    // cout << index << endl;
    if(index == -1){
        cout << target << " not found in the list" << endl;
    }
    else{
        cout << target << " found at index " << index << endl;
    }
}
 
// The code is contributed by Gautam goel. 

输出
在索引 4 处找到 5 个

        插值搜索平均进行 log(log(n)) 次比较(如果元素均匀分布),其中 n 是要搜索的元素数量。在最坏的情况下(例如键的数值呈指数增加),它可以进行 O(n) 比较。 

时间复杂度: O(log(log n)) 

空间复杂度: O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/644202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网卡技术解密:理解网卡背后的原理

✍✍在这个信息爆炸的时代&#xff0c;网卡承载着无数数据的流动&#xff0c;是我们日常生活和工作不可或缺的一部分。但是&#xff0c;您是否曾经好奇过&#xff0c;这些小小的硬件是如何在瞬息万变的网络世界中稳定地发挥作用的呢&#xff1f; 想象一下&#xff0c;每当我们…

等变超图扩散神经算子

导读 论文题目《EQUIVARIANT HYPERGRAPH DIFFUSION NEURAL OPERATORS》。该论文发表于会议ICLR 2023&#xff0c;其提出了一种新的HNN架构&#xff0c;命名为ED-HNN&#xff0c;它可以可证地逼近任何连续等变超图扩散算子&#xff0c;可以模拟各种高阶关系。 摘要 使用神经网络…

【黑马点评Redis——003优惠券秒杀2】

1.分布式锁 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 需要满足的特点&#xff1a; 多进程可见互斥高可用高性能安全性 1.1 分布式锁的实现 分布式锁的核心是实现多进程之间互斥&#xff0c;常见的方法有三种&#xff1a; 1.2 基于Redis…

POE 供电iP网络音箱2*15W 教学广播音箱 办公室背景音乐广播音箱SV-7041

SV-7041是一款IP网络音响&#xff0c;具有10/100M以太网接口&#xff0c;从网络接口接收网络的音频数据后播放&#xff0c;提供双路左右声道的音频输出。 该IP网络音响有主音箱和副音箱&#xff0c;主音箱为有源音箱&#xff0c;副音箱为无源音箱。该IP网络音响可以与其他广播终…

matlab回归学习

前言 所谓回归学习即预测&#xff0c;便是由已知的数据推测未知的数据&#xff0c;利用转速与转矩来推测电流。 1、数据准备 下面虚拟一组转速转矩以及电流数据。 speed [100 220 330 440 550 660]; torque [200 300 400 500 700 900]; I [400 500 603 739 821 912]; arr …

鸿蒙开发HarmonyOS4.0入门与实践

鸿蒙开发HarmonyOS4.0 配合视频一起食用&#xff0c;效果更佳 课程地址&#xff1a;https://www.bilibili.com/video/BV1Sa4y1Z7B1/ 源码地址&#xff1a;https://gitee.com/szxio/harmonyOS4 准备工作 官网地址 鸿蒙开发者官网&#xff1a;https://developer.huawei.com/con…

vue3引入图片 无法使用require, vue3+vite构建项目使用require引入包出现问题需要用newURL来动态引入图片等静态资源

在vue3中 require引入图片的本地资源报错Uncaught (in promise) ReferenceError: require is not defined <template> <img :src"imageSrc" alt"My Image"> </template> <script> import imageSrc from /assets/image.png; export…

【计算机毕业设计】jspm医院门诊挂号系统——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

学习Rust第15天:错误处理

错误管理是Rust编程的重要组成部分&#xff0c;允许开发人员优雅地处理不可预见的事件。Rust有各种错误管理功能&#xff0c;包括用于故意程序崩溃的panic宏&#xff0c;用于描述操作结果的Result枚举&#xff0c;以及简单错误传播的操作符。使用这些方法和定制的错误类型&…

密码学 | Schnorr 协议:零知识身份证明和数字签名

&#x1f955;原文&#xff1a; Schnorr 协议&#xff1a;零知识身份证明和数字签名 &#x1f955;写在前面&#xff1a; 本文属搬运博客&#xff0c;自己留存学习。文中的小写字母表示标量&#xff0c;大写字母表示椭圆曲线中的点。 1 Schnorr 简介 Schnorr 由德国数学家和密…

GUI测试首推!TestComplete 帮助有效缩短 40-50% 测试时长!

TestComplete 是一款自动化UI测试工具&#xff0c;这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎&#xff0c;可以自动记录和回放用户的操作&#xff0c;方便用户进行UI&#xff08;用户界面&…

数据结构之顺序表(java版)

目录 一.线性表 1.1线性表的概念 二.顺序表 2.1顺序表的概念 2.2顺序表的实现 1.顺序表的接口 1.2顺序表的功能实现 1.顺序表初始化 2.新增元素功能&#xff1a; 3.清空顺序表是否为空&&获取顺序表长度&&打印顺序表&#xff1a; 4.判断是否包含某个…