java 跳转搜索(Jump Search)

news2024/11/28 6:28:58

        与二分搜索一样,跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素(比线性搜索)。例如,假设我们有一个大小为 n 的数组 arr[] 和一个大小为 m 的块(要跳转)。然后我们在索引 arr[0]、arr[m]、arr[2m]…..arr[km] 等中搜索。一旦找到区间 (arr[km] < x < arr[(k+1)m]),我们就从索引 km 执行线性搜索操作来查找元素 x。让我们考虑以下数组:(0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610)。数组长度为 16。

假设要跳转的块大小为 4,跳转搜索将找到值 55,步骤如下:

步骤 1:从索引 0 跳转到索引 4;

步骤2:从索引4跳转到索引8;

步骤3:从索引8跳转到索引12;

步骤 4:由于索引 12 处的元素大于 55,因此我们将跳回到索引 8。

步骤 5:从索引 8 执行线性搜索以获取元素 55。

插图非示例

与线性搜索和二分搜索相比的性能:
        如果我们将它与线性搜索和二分搜索进行比较,那么它比线性搜索更好,但不比二分搜索更好。
性能递增顺序为:
        线性搜索 < 跳转搜索 < 二分搜索
要跳过的最佳块大小是多少?在最坏的情况下,我们必须进行 n/m 次跳转,如果最后检查的值大于要搜索的元素,我们会为线性搜索多执行 m-1 次比较。因此,最坏情况下的总比较次数将为((n/m) + m-1)。当 m = ?n 时,函数 ((n/m) + m-1) 的值最小。因此,最佳步长为 m = ?n。 

算法步骤
1、跳转搜索是一种通过跳过数组中的某些步骤来查找已排序数组中的特定值的算法。
2、步骤由数组长度的 sqrt 确定。 
以下是跳跃搜索的分步算法:
1、通过取数组 n 长度的 sqrt 来确定步长 m。
2、从数组的第一个元素开始,跳 m 步,直到该位置的值大于目标值。
        一旦找到大于目标的值,就从上一步开始进行线性搜索,直到找到目标或者明确目标不在数组中。
        如果找到目标,则返回其索引。如果没有,则返回 -1 表示在数组中未找到目标。 

示例:

// Java program to implement Jump Search.
public class JumpSearch
{
    public static int jumpSearch(int[] arr, int x)
    {
        int n = arr.length;
 
        // Finding block size to be jumped
        int step = (int)Math.floor(Math.sqrt(n));
 
        // Finding the block where element is
        // present (if it is present)
        int prev = 0;
        for (int minStep = Math.min(step, n)-1; arr[minStep] < x; minStep = Math.min(step, n)-1)
        {
            prev = step;
            step += (int)Math.floor(Math.sqrt(n));
            if (prev >= n)
                return -1;
        }
 
        // Doing a linear search for x in block
        // beginning with prev.
        while (arr[prev] < x)
        {
            prev++;
 
            // If we reached next block or end of
            // array, element is not present.
            if (prev == Math.min(step, n))
                return -1;
        }
 
        // If element is found
        if (arr[prev] == x)
            return prev;
 
        return -1;
    }
 
    // Driver program to test function
    public static void main(String [ ] args)
    {
        int arr[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21,
                    34, 55, 89, 144, 233, 377, 610};
        int x = 55;
 
        // Find the index of 'x' using Jump Search
        int index = jumpSearch(arr, x);
 
        // Print the index where 'x' is located
        System.out.println("\nNumber " + x +
                            " is at index " + index);
    }

输出:
        数字 55 位于索引 10
时间复杂度:O(?n) 
辅助空间:O(1)

跳转搜索的优点:
        1、比元素均匀分布的数组的线性搜索更好。
        2、与大型数组的线性搜索相比,跳跃搜索的时间复杂度较低。
        3、跳跃搜索的步数与数组大小的平方根成正比,对于大型数组来说效率更高。
        4、与二分搜索或三元搜索等其他搜索算法相比,它更容易实现。
        5、跳转搜索适用于元素有序且均匀分布的数组,因为它可以在每次迭代时跳转到数组中更接近的位置。

要点:
        1、仅适用于排序数组。
        2、所要跳转的块的最佳大小是(?n)。这使得跳转搜索的时间复杂度为O(?n)。
        3、跳转搜索的时间复杂度介于线性搜索 ((O(n)) 和二分搜索 (O(Log n)) 之间。
        4、二分查找比跳转查找要好,但是跳转查找的优点是我们只需要回溯一次(二分查找可能需要最多 O(Log n) 次跳转,考虑要查找的元素是最小元素或者更大的元素的情况比最小的)。因此,在二分搜索成本高昂的系统中,我们使用跳转搜索。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

隐私计算实训营学习六:隐语PIR介绍及开发指南

文章目录 一、隐语实现的PIR总体介绍1.1 PIR的定义和种类1.2 隐语PIR功能分层 二、Index PIR-SealPIR介绍三、Keyword PIR- Labeled PSI介绍四、隐语PIR后续计划 一、隐语实现的PIR总体介绍 1.1 PIR的定义和种类 PIR(Private Information Retrieval PIR)隐匿查询&#xff1a;…

比亚迪的薪资。。。当年的迪子,今年的迪爹……

大家好&#xff0c;我是小黄。 俗话说金3银4&#xff0c;比亚迪一直都是一个相对热门的公司&#xff0c;“去年迪子&#xff0c;今年迪爹&#xff0c;去年座位空一大半&#xff0c;今年走廊都站满人……”这是很多应届毕业生对比亚迪的评价。 当年小黄毕业的时候&#xff0c;…

[计算机效率] 文件加密工具:Lockdir

3.11 文件加密工具&#xff1a;Lockdir Lockdir是一款安全性高、使用简单、体积极小的便携式文件夹加密器&#xff0c;无需安装&#xff0c;一键加密&#xff0c;一键解密&#xff0c;加密算法高&#xff0c;是优秀的加密工具。其主要特点包括&#xff1a; 加密操作简易&#…

hadoop-3.1.1分布式搭建与常用命令

一、准备工作 1.首先需要三台虚拟机&#xff1a; master 、 node1 、 node2 2.时间同步 ntpdate ntp.aliyun.com 3.调整时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 4.jdk1.8 java -version 5.修改主机名 三台分别执行 vim /etc/hostname 并将内容指定为…

酷开会员丨看、学、用、玩的智慧电视,酷开系统享你所想!

在数字化浪潮席卷之下&#xff0c;电视这个曾作为家庭娱乐设备中心的“客厅霸主”&#xff0c;在现代家庭中的地位似乎变得模糊起来。随着时代的发展&#xff0c;人们不再仅仅满足于电视观看节目的单一功能&#xff0c;而是期待电视能够提供更多元化、更智能的交互体验。考虑到…

[leetcode] 100. 相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&a…

cookie介绍

文章目录 1.cookie是什么&#xff1f;2.cookie的存储位置3.什么是无状态问题&#xff0c;以及如何解决 4.存储在客户端的好处5.cookie的主要特点6.cookie的缺点7.cookie的产生过程8.cookie的使用步骤1.安装依赖2.引入依赖3.在中间件注册 9.cookie代码示例10.cookie的有效期 1.c…

电子级高纯PFA材质实验室器皿耗材PFA漏斗PFA试剂瓶PFA烧杯

PFA三角漏斗&#xff0c;整体均是PFA材质&#xff0c;无污染风险&#xff0c;可高压灭菌。 尺寸&#xff1a;外径40mm、160mm PFA三角漏斗 特点&#xff1a; 1、一体式成型&#xff0c;结构稳定&#xff1b; 2、化学耐受性强&#xff0c;耐受强酸、强碱以及各种有机溶剂&…

上位机图像处理和嵌入式模块部署(qmacvisual寻找圆和寻找直线)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面有几篇文章&#xff0c;我们谈到过直线拟合、圆拟合和椭圆拟合。当时&#xff0c;我们的做法是&#xff0c;先找到了轮廓&#xff0c;接着找到…

数据资产如何入表?有哪些步骤?

当下&#xff0c;数据资产入表这一关键环节对于企业的高效运营与决策制定具有至关重要的作用。软信天成团队经过长期研究与实践&#xff0c;将数据资产入表的全流程归纳总结为四个核心步骤&#xff0c;以期为诸位提供帮忙。 &#xff08;一&#xff09;确保数据合规&#xff0…

8.均值滤波

1 简介 均值滤波是一种低通滤波&#xff0c;它可以有效过滤图片中的椒盐噪声&#xff0c;但是副作用也同样明显&#xff0c;会使图片的边缘过于模糊。   均值滤波的卷积核系数均为1。   这里最终重复一下算法实现以及验证的步骤&#xff1a;     1.MATLAB读取图片并转化…

JVM实战之性能调优[2](线程转储案例认识和分析)

文章目录 版权声明案例1&#xff1a;CPU占用率高问题问题描述解决思路补充内容 案例2&#xff1a;接口响应时间长问题问题描述解决思路Arthas trace命令Arthas watch命令解决问题 案例3&#xff1a;定位偏底层性能问题问题描述解决思路&#xff1a;Arthas火焰图问题解决 案例4&…

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战

高级DBA带你处理MySQL客户端程序频繁访问MYSQL数据库并错误链接不释放导致连接数爆满事故实战 一、生产事故描述 Mysql生产数据库最大连接数爆满&#xff0c;其余客户端也同样拿不到数据库连接&#xff0c;生产异常&#xff0c;数据传输失败&#xff01; 报错如下&#xff1a…

有趣的css - 文字下划线条动画按钮

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现文字下划线条动画按钮。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页…

【WEEK5】 【DAY5】DML语言【中文版】

2024.3.29 Friday 目录 3.DML语言3.1.外键&#xff08;了解&#xff09;3.1.1.概念3.1.2.作用3.1.3.添加&#xff08;书写&#xff09;外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写&#xff08;被引用的表的被引用的部分&#xff09;3.1.3.2.先创建表后修改表以添加…

近年来,常见5大软件开发项目管理工具

时代进步&#xff0c;技术进步&#xff0c;汇总下近几年5大常用的软件开发项目管理工具。 1、微软项目管理软件 Microsoft Project&#xff08;或MSP&#xff09;是由微软开发销售的项目管理软件程序。软件设计目的在于协助项目经理制定发展计划、为任务分配资源、跟踪进度、管…

目标检测——门牌号数据集

一、重要性及意义 识别自然场景图像中的数字和号码具有极高的重要性和意义&#xff0c;这主要体现在以下几个方面&#xff1a; 实际应用广泛性&#xff1a;自然场景中的数字和号码识别技术在日常生活中有着广泛的应用。例如&#xff0c;在自动驾驶车辆中&#xff0c;准确识别路…

【网站项目】面向社区健康服务的医疗平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【动手学深度学习】深入浅出深度学习之利用神经网络识别螺旋状数据集

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 生成螺旋状数据集 &#x1f33c;2. 打印数据集 &#x1f33c;3. 编程实现 &#x1f33b;仿射层-Affine类 &#x1f33b;传播层-Sigmoid类 &#x1f33b;损失函数…

SSH连接SFTP传输:如何使用libssh库在windows环境下进行(文件、文件夹)传输到远端服务器

配置环境cmake编译libssh如何使用生成的dll与lib文件配置lib 方法一配置lib 方法二配置dll方法一 将dll配置进入环境变量配置dll方法二 在编译过后将dll直接与可执行文件.exe文件放在同一目录下传输文件、文件夹代码&#xff08;适配windows&#xff09; 由于windows上的编译器…