【算法系列 | 11】深入解析查找算法之—插值查找

序言

心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。

决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。

我们一起努力,成为更好的自己!

今天第11讲,讲一下查找算法的—插值查找算法

一、基础介绍

查找算法是计算机科学中的一类算法,用于在数据集中寻找特定值或数据项。

其目标是确定数据是否存在于给定的数据结构中,并找到数据项的位置(索引)或其他相关信息。

不同的查找算法适用于不同类型的数据结构,数据有序性,以及数据规模。以下是一些常见的查找算法

以下是一些常见的查找算法及其应用场景:

  • 布隆过滤器(Bloom Filter):适用于判断一个元素是否存在于一个大规模的数据集中,时间复杂度为O(1),但有一定的误判率。

  • 二分查找(Binary Search):适用于有序数组中查找元素,时间复杂度为O(log n);

  • 哈希表查找(Hash Table):适用于快速查找和插入元素,时间复杂度为O(1),但需要额外的存储空间;

  • 线性查找(Linear Search):适用于无序数组中查找元素,时间复杂度为O(n);

  • 插值查找(Interpolation Search):适用于有序数组中查找元素,时间复杂度为O(log log n),但是对于分布不均匀的数据集效果不佳;

  • 斐波那契查找(Fibonacci Search):适用于有序数组中查找元素,时间复杂度为O(log n),但需要额外的存储空间;

  • 树表查找(Tree Search):适用于快速查找和插入元素,时间复杂度为O(log n),但需要额外的存储空间;

  • B树查找(B-Tree):适用于大规模数据存储和查找,时间复杂度为O(log n),但需要额外的存储空间;

一、算法介绍

1.1 原理介绍

插值查找是一种改良版的二分查找算法,其基本原理是根据要查找的值在有序数组中的大致位置进行估计,以此来缩小搜索范围,从而提高查找效率。

插值查找的核心思想是通过数据的分布情况来预测目标值的位置,从而更快地逼近目标。

特别适用于有序且均匀分布的数据集

插值查找的实现步骤

插值查找的实现步骤相对简单,主要包括以下几个步骤:

a. 计算插值位置

首先,通过插值公式计算目标值在数组中的估计位置:

其中,low[low ]和 high[high]分别是数组的起始位置和结束位置,array[low] 和 array[high] 分别是对应位置的元素值。

b. 判断目标值位置

比较目标值与估计位置的大小关系,决定在左半部分还是右半部分继续查找。

c. 递归或迭代

根据比较结果,继续在选定的半部分进行插值查找,直到找到目标值或确定目标值不存在。

1.2 优缺点

优点:

  • 适用于均匀分布的数据集: 插值查找在数据集均匀分布时效果更为显著,能够更准确地估计目标值的位置。

  • 相对于二分查找的改进: 在某些情况下,插值查找的效率较二分查找更高,尤其是对于近似均匀分布的数据。

缺点:

  • 对于不均匀分布的数据效果不佳: 当数据分布不均匀时,插值查找的性能可能较差,甚至不如二分查找。

  • 可能导致溢出: 在计算插值位置时,由于分母可能为零,导致除法溢出的风险。

1.3 复杂度

插值查找的时间复杂度主要取决于查找的数据分布情况,但最坏情况下的时间复杂度仍然是 O(log n)。下面是插值查找的复杂度的详细解释:

  1. 最好情况时间复杂度:O(1) 如果你运气好,目标元素恰好在数组的中间位置,此时插值查找的时间复杂度为常数级别,即 O(1)。这种情况下,插值查找的效率最高。

  2. 平均情况时间复杂度:O(log log n) 到 O(log n) 在平均情况下,插值查找的时间复杂度在 O(log log n) 到 O(log n) 之间。这是因为插值查找适用于均匀分布的数据,能够更准确地估计目标值的位置。在每一步查找中,搜索范围都会迅速减半,类似于二分查找。

  3. 最坏情况时间复杂度:O(n) 最坏情况下的时间复杂度为 O(n),通常发生在数据分布不均匀的情况下。如果数据分布不均匀,插值查找可能会导致多次不必要的递归或迭代,使得时间复杂度增加。

总体来说,插值查找在数据分布较为均匀的情况下性能较好,但在不均匀分布的情况下可能退化为线性查找。

因此,在选择查找算法时,需要根据实际数据分布情况权衡算法的优缺点。插值查找的优势在于能够更好地适应均匀分布的数据,但在不确定数据分布情况时,二分查找等算法可能更稳定。

1.4 使用场景

插值查找适用于数据集较大且分布相对均匀的情况,例如在数字、日期等有序数据的查找中表现较好。

在这些场景下,插值查找能够更准确地估计目标值的位置,从而提高查找效率。

1.5 拓展

可以用更简单的语言来解释插值查找算法的原理。

比方说你在一本按照字母顺序排列的电话簿中找人的电话号码。

  1. 常规查找(比如二分查找): 你会打开电话簿的中间,看这个名字是在中间的上面还是下面。然后根据比较的结果,再在剩下的一半中间找。

  2. 插值查找: 插值查找不是简单地在中间找,而是像“猜谜底”一样,通过一些估算,去猜测名字更可能在哪。比如,如果你要找的名字离电话簿的开头近,插值查找就猜测他可能在电话簿的前面。然后,你再根据这个猜测去找。

为什么这样做更快呢?🤔

假如电话簿中的名字是均匀分布的,你可以更准确地猜测名字的位置。就好比你知道字母表中的字母是均匀分布的,你可以更快地找到某个字母的位置。

总的来说,插值查找是一种更智能的查找方法,通过估算目标的位置,可以更快地找到你要找的东西。

二、代码实现

2.1 Java代码实现

2.1.1 代码示例

public class InterpolationSearch {

    public static int interpolationSearch(int[] array, int target) {
        int low = 0;
        int high = array.length - 1;

        while (low <= high && target >= array[low] && target <= array[high]) {
            // 使用插值公式计算估计位置
            int pos = low + ((target - array[low]) * (high - low)) / (array[high] - array[low]);

            if (array[pos] == target) {
                return pos; // 找到目标值,返回位置
            } else if (array[pos] < target) {
                low = pos + 1; // 在右半部分查找
            } else {
                high = pos - 1; // 在左半部分查找
            }
        }

        return -1; // 目标值不存在
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20};
        int target = 12;

        int result = interpolationSearch(array, target);

        if (result != -1) {
            System.out.println("目标值 " + target + " 在数组中的位置是:" + result);
        } else {
            System.out.println("目标值 " + target + " 未在数组中找到。");
        }
    }
}

2.1.2 代码详解

  1. interpolationSearch 方法是插值查找的实现,接受一个有序数组 array 和目标值 target 作为参数。

  2. lowhigh 分别表示数组的起始和结束位置。

  3. 使用 while 循环进行查找,确保目标值在数组范围内。

  4. 插值公式计算估计位置 pos,并根据与目标值的比较确定在左半部分还是右半部分继续查找。

  5. 如果找到目标值,返回它在数组中的位置;如果未找到,返回 -1。

  6. main 方法演示了如何使用插值查找算法来查找目标值在数组中的位置。

2.1.3 运行结果

目标值 12 在数组中的位置是:6

  • 目标值 12 在给定的有序数组 {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20} 中的位置是索引 6

  • 因此,输出结果表示目标值 12 在数组中的位置为 6

2.2 Python代码实现

2.2.1 代码示例

def interpolation_search(array, target):
    low = 0
    high = len(array) - 1

    while low <= high and array[low] <= target <= array[high]:
        # 使用插值公式计算估计位置
        pos = low + ((target - array[low]) * (high - low)) // (array[high] - array[low])

        if array[pos] == target:
            return pos  # 找到目标值,返回位置
        elif array[pos] < target:
            low = pos + 1  # 在右半部分查找
        else:
            high = pos - 1  # 在左半部分查找

    return -1  # 目标值不存在


# 示例用法
array = [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
target = 12

result = interpolation_search(array, target)

if result != -1:
    print(f"目标值 {target} 在数组中的位置是:{result}")
else:
    print(f"目标值 {target} 未在数组中找到。")

2.2.2 代码详解

  1. interpolation_search 函数是插值查找的实现,接受一个有序数组 array 和目标值 target 作为参数。

  2. lowhigh 分别表示数组的起始和结束位置。

  3. 使用 while 循环进行查找,确保目标值在数组范围内。

  4. 插值公式计算估计位置 pos,并根据与目标值的比较确定在左半部分还是右半部分继续查找。

  5. 如果找到目标值,返回它在数组中的位置;如果未找到,返回 -1。

  6. 示例用法中演示了如何使用插值查找算法来查找目标值在数组中的位置。

2.2.3 运行结果

运行这段代码将输出:

目标值 12 在数组中的位置是:6

这表示目标值 12 在给定的有序数组 [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] 中的位置是索引 6

好啦,今天就到这里啦,下期见喽~~🙉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器端口PPTP 1723放行教程

阿里云服务器安装PPTP VPN需要先开通1723端口&#xff0c;阿里云服务器端口是在安全组中操作的&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说明阿里云服务器安全组开放PPTP VPN专用1723端口教程&#xff1a; 阿里云服务器放行1723端口教程 PPTP是点对点隧道协议&#…

八大算法排序@选择排序(C语言版本)

目录 选择排序概念算法思想示例步骤1步骤2步骤...n最后一步 代码实现时间复杂度空间复杂度特性总结 选择排序 概念 选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。基本思想是在未排序的序列中找到最小&#xff08;或最大&#xff09;元素&#xf…

数据库之索引

1. 索引的定义 索引是一个排序的列表&#xff0c;包含索引字段的值和其对应的行记录的数据所在的物理地址。 索引的作用&#xff1a; 加快表的查询速度&#xff0c;还可以对字段排序。 2. 索引的工作方式 有了索引后&#xff0c;要根据条件查询某行数据时&#xff0c;需要先…

IPA打包过程中的Invalid Bundle Structure错误如果解决

在iOS应用程序开发中&#xff0c;打包和发布应用程序是一个必要的步骤。有的时候在打包的过程中可能会遇到一些错误&#xff0c;其中一个比较常见的错误是"Invalid Bundle Structure"。这个错误通常意味着应用程序的文件结构不正确&#xff0c;而导致的无法成功打包应…

自动循环采集全站文章

如果文章页面中&#xff0c;有上一篇、下一篇文章&#xff0c;推荐文章等链接&#xff0c;我们可以利用这个特点&#xff0c;仅配置采集一个文章页面&#xff0c;即可采集整个网站或某个分类下的所有文章&#xff0c;实现自动循环采集全站数据&#xff0c;非常方便简单。 使用…

天然药物,到2028年市场规模将达到 3082亿美元

天然药物&#xff0c;也称为草药或传统药物&#xff0c;是指将植物、矿物和动物产品等天然物质用于药用目的。近年来&#xff0c;人们对天然药物作为传统药物的替代品越来越感兴趣&#xff0c;这导致了天然药物市场的增长。全球天然药物市场&#xff1a; 全球天然药物市场预计从…

2024腾讯云服务器租用价格表_优惠活动大全_最新报价

腾讯云服务器租用价格表&#xff1a;轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月&#xff0c;云服务器CVM S5实例2核2G配置280.8元一年…

安科瑞余压监控系统在住宅小区的应用方案——安科瑞 顾烊宇

【摘要】&#xff1a;本文分析了火灾发生时人员伤亡的主要原因——烟雾&#xff0c;并针对该原因提供切实可靠的系统应用解决方案&#xff0c;并通过具体案例&#xff0c;从设计依据、产品选型、系统组网、现场安装等方式介绍余压监控系统&#xff0c;希望可以在火灾发生时较大…

BMS均衡技术

一、电池的不一致性&#xff1f; 每个电池都有自己的“个性”&#xff0c;要说均衡&#xff0c;得先从电池谈起。即使是同一厂家同一批次生产的电池&#xff0c;也都有自己的生命周期、自己的“个性”——每个电池的容量不可能完全一致。例如以下的两个原因都会造成电池不一致…

树与二叉树笔记整理

摘自小红书 ## 树与二叉树 ## 排序总结

【数据库】MySQL数据库存储引擎、数据库管理和数据库账号管理

【数据库】MySQL数据库存储引擎、数据库管理和数据库账号管理 一 常用的数据引擎1.1 InnoDB存储引擎1.2 MyISAM存储引擎1.3 Memory存储引擎1.4 ARCHIVE存储引擎 二 数据库管理2.1 元数据库概念与分类2.2 相关操作命令 三 数据表的管理四 数据库账户管理 一 常用的数据引擎 数据…

清风数学建模笔记-多分类-fisher线性判别分析

内容&#xff1a;Fisher线性判别分析 一.介绍&#xff1a; 1.给定的训练姐&#xff0c;设法投影到一维的直线上&#xff0c;使得同类样例的投影点尽可能接近和密集&#xff0c;异类投影点尽可能远离。 2.如何同类尽可能接近&#xff1a;方差越小 3.如何异类尽可能远离&#…

阿里云2核2G3M服务器能放几个网站?有限制吗?

阿里云2核2g3m服务器可以放几个网站&#xff1f;12个网站&#xff0c;阿里云服务器网的2核2G服务器上安装了12个网站&#xff0c;甚至还可以更多&#xff0c;具体放几个网站取决于网站的访客数量&#xff0c;像阿里云服务器网aliyunfuwuqi.com小编的网站日访问量都很少&#xf…

获取网页信息

每次copy & paste总是很麻烦&#xff0c;现在有点问题&#xff0c;先记录下来。 需求&#xff1a;获取url 里Feature list&#xff0c;并输出表格形式 可以用Convert curl commands to code&#xff1a;得到get请求的header&#xff0c;cookie等 import requests import…

Jmeter二次开发实操问题汇总(JDK问题,jar包问题)

前提 之前写过一篇文章&#xff1a;https://qa-lsq.blog.csdn.net/article/details/119782694 只是简单尝试了一下生成一个随机手机号码。 但是如果在工作中一个实际场景要用的二次开发&#xff0c;可能会遇到一些问题。 比如这样一个场景&#xff1a; Mobile或者前端调用部分…

【动态规划】LeetCode-10. 正则表达式匹配

10. 正则表达式匹配。 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。 ‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整个 字符串 s的&#xff0c;而不是部分字符串。 …

conda: error: argument COMMAND: invalid choice: ‘activate‘

1.问题 2.解决方法 1.寻找基本路径 conda info | grep -i base environment2.更新资源 source /Users/suhang/miniconda3/etc/profile.d/conda.sh3.重新运行命令 conda activate chatglm参考图&#xff1a;

UI5与后端的文件交互(一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、RAP的开发1. 创建表格2. 创建CDS Entity3. 创建BDEF4. 创建implementation class5. 创建Service Definition和Binding6. 测试API 二、创建UI5 Project1. 使…

jsp+ssm+mysql实现的酒店预定管理系统项目----计算机毕业设计

项目介绍 jspssm框架&#xff08;spring、springMVC、mybaits&#xff09;实现的酒店预定管理系统的源码和视频开发教程。本系统分前台和后台管理两部分&#xff0c;前台实现了用户登录注册、查看房型信息、预定房间、提交订单、查看个人订单、修改个人资料等&#xff0c;后台…

打造高效会员卡营销策划方案,提升门店业绩

在激烈的行业竞争中&#xff0c;如何有效提升店铺的业绩&#xff0c;提高客户粘性和消费频次呢&#xff1f;答案可能就在你手中——那就是有效的会员卡营销策略。下面给大家探讨如何设计会员卡营销策划方案&#xff0c;从而增加客户的忠诚度&#xff0c;并推动销售增长。以目前…