c++ 跳转搜索(Jump Search)

        与二分搜索一样,跳转搜索是一种针对排序数组的搜索算法。基本思想是通过按固定步骤向前跳跃或跳过某些元素来代替搜索所有元素来检查更少的元素(比线性搜索)。例如,假设我们有一个大小为 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 表示在数组中未找到目标。 

示例:

// C++ program to implement Jump Search
 
#include <bits/stdc++.h>
using namespace std;
 
int jumpSearch(int arr[], int x, int n)
{
    // Finding block size to be jumped
    int step = sqrt(n);
 
    // Finding the block where element is
    // present (if it is present)
    int prev = 0;
    while (arr[min(step, n)-1] < x)
    {
        prev = step;
        step += 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 == min(step, n))
            return -1;
    }
    // If element is found
    if (arr[prev] == x)
        return prev;
 
    return -1;
}
 
// Driver program to test function
int main()
{
    int arr[] = { 0, 1, 1, 2, 3, 5, 8, 13, 21,
                34, 55, 89, 144, 233, 377, 610 };
    int x = 55;
    int n = sizeof(arr) / sizeof(arr[0]);
     
    // Find the index of 'x' using Jump Search
    int index = jumpSearch(arr, x, n);
 
    // Print the index where 'x' is located
    cout << "\nNumber " << x << " is at index " << index;
    return 0;
}
 
// Contributed by nuclode

输出:
        数字 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) 次跳转,考虑要查找的元素是最小元素或者更大的元素的情况比最小的)。因此,在二分搜索成本高昂的系统中,我们使用跳转搜索。

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

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

相关文章

PEReDi 完全隐私的央行数字货币方案

第一个对完全隐私保护建模的方案&#xff0c;基于账户模型&#xff0c;要求交易双方都在线。 角色分类 中央银行 B B B&#xff1a;负责发行数字货币和货币政策&#xff0c;但不控制用户账户的状态&#xff0c;没有能力对交易的发送者或接收者进行去匿名化或披露与特定交易相…

数据结构-队列-005

1链式队列 运行结果如下&#xff1a; 1.1链式队列结点定义 /*自定义一个数据类型*/ typedef struct student {char name[32];char sex;int age; }DATA_TYPE;/*定义一个链式队列结点*/ typedef struct link_queue_node {DATA_TYPE data;//数据域struct link_queue_node *pne…

SpringBoot和SpringCloud面试题

1、SpringBoot 1.1 和Spring对比 1.2 SpringBoot自动装配 springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类&#xff0c;并生成相应的Bean对象&#xff0c;然后将它们交给spring容器来帮我们进行管理 原理 SpringBootApplicatio…

BUUCTF-Misc13

[ACTF新生赛2020]outguess1 1.打开附件 2.outguess outguess -k "abc" -r mmm.jpg flag.txt “-k “abc”” 表示使用密码 “abc” 进行解密&#xff1b; “-r” 表示提取信息的操作&#xff1b; “mmm.jpg” 是包含隐藏信息的源图像文件&#xff1b; “flag.txt” …

共用体详解

1 共用体的概念 有时需要使几种不同类型的变量存放到同一段内存单元中。例如,可把一个整型变量、一个字符型变量、一个实型变量放在同一个地址开始的内存单元中(见图11.24)。以上3个变量在内存中占的字节数不同,但都从同一地址开始(图中设地址为1000)存放。也就是使用覆盖技术…

“数据持久化”和“缓存与数据库不一致”到底有什么区别?

之前&#xff0c;我一直把“数据持久化”和“缓存与数据库不一致问题”给搞混了。我当时复习的时候基本上就没有思考&#xff0c;就是纯背诵&#xff0c;数据持久化是什么&#xff0c;数据持久化有两种方式&#xff0c;这两种方式特点是什么&#xff0c;然后巴拉巴拉一堆。缓存…

LC 100.相同的树

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

【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

目录 前言 1、文件目录 2、安装依赖 3、POM项目实战-案例&#xff1a;打开指定页面 目录结构&#xff1a; pages中的代码&#xff1a; cases中的代码&#xff1a; 4、解决登录问题 问题&#xff1a; 解决方案&#xff1a; 获取登录的用户信息&#xff08;cookie&a…

GTC 2024 火线评论:DPU 重构文件存储访问

编者按&#xff1a;英伟达2024 GTC 大会上周在美国加州召开&#xff0c;星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论&#xff0c;继上一篇《GTC 2024 火线评论&#xff1a;GPU 的高效存储利用》之后&#xff0c;这是他发回的第二篇评论文章。 上一篇文章…

数据意外变化导致条件判断流程异常

1. 问题描述 用户使用的 MCU 型号是 STM32H750VB。 在客户的代码中有多个条件语句&#xff0c;在条件里面的变量数值没有变化的情况下执行了条件里面的逻辑。 有点类似如下 C 语句 : If(变量 A !0) {//执行一些指令 }即变量 A 在明明没有变化且条件不满足的情况下, 程序运行时…

程序员卷王的简历

这真是一份淋漓尽致、低入尘埃、舔到骨髓的优势。 但从一个hr的角度来看&#xff0c;依然有可以继续提升的地方。 比如&#xff1a; 优势第一条本身就有问题&#xff0c;不懂劳动法&#xff1f;你怎么还会有劳动法这个概念&#xff01;你知道“劳动法”本身&#xff0c;这个…

自动采集实时海量主流电商平台API数据接口,让你拥有一手绝对好牌!

前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。 平时需要从某些电商网站上抓取数据&#xff0c;那么这里以淘宝为示例给大家演示。这…

selenium元素定位--xpath定位--层级与逻辑组合定位

其他元素非唯一时&#xff0c;又不想用xpath绝对定位时&#xff0c;需要用到层级与逻辑定位. 一、层级属性结合定位&#xff1a; 遇到元素没有class、name、id等或属性动态变化情况时&#xff0c;可以找父节点元素&#xff0c;父级节点没有id时&#xff0c;可以继续往上找id&…

HeidiSQL导出SQL文件

目前开发阶段的数据库可视化工具逐渐转为了HeidiSQL&#xff0c;本文讲一讲导出到sql文件的小细节&#xff0c;给自己做个记录补充。 安装或数据库可视化工具比较可参考&#xff1a; windows下全免费手动搭建php8mysql8开发环境及可视化工具安装 导出 原来用Navicat的时候&am…

git下载安装教程

git下载地址 有一个镜像的网站可以提供下载&#xff1a; https://registry.npmmirror.com/binary.html?pathgit-for-windows/图太多不截了哈哈&#xff0c;一直next即可。

macOS Sonoma 14.4.1 (23E224) 正式版发布,ISO、IPSW、PKG 下载

macOS Sonoma 14.4.1 (23E224) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 2024 年 3 月 26 日凌晨&#xff0c;macOS Sonoma 14.4.1 更新修复了一个可能导致连接到外部显示器的 USB 集线器无法被识别的问题。它还解决了可能导致 Java 应用程序意外退出的问题&#xff0c;并修…

淘宝详情数据采集(商品上货,数据分析,属性详情,价格监控),海量数据值得get

淘宝详情数据采集涉及多个环节&#xff0c;包括商品上货、数据分析、属性详情以及价格监控等。在采集这些数据时&#xff0c;尤其是面对海量数据时&#xff0c;需要采取有效的方法和技术来确保数据的准确性和完整性。以下是一些关于淘宝详情数据采集的建议&#xff1a; 请求示…

基于 MCSDK5.4.8 电机库修改两电阻采样方法

1. 前言 在当前使用的电机电阻采样方式中分为单电阻&#xff0c;双电阻&#xff0c;三电阻三种方式&#xff0c;其中在 ST MCSDK5.4 库中支持了两种采样方式&#xff0c;单电阻和三电阻&#xff0c;在市面还存在另外一种采样方式&#xff0c;即双电阻采样&#xff0c;本文讨论…

机器学习:数据降维主成分分析PCA

一、引言 1.数据分析的重要性   在当今的信息爆炸时代&#xff0c;数据已经渗透到各个行业和领域的每一个角落&#xff0c;成为决策制定、科学研究以及业务发展的重要依据。数据分析则是从这些数据中提取有用信息、发现潜在规律的关键手段。通过数据分析&#xff0c;我们能够…

【QGIS基于边界裁剪DEM】

文章目录 1、前言2、操作步骤 1、前言 QGIS内置的栅格裁剪工具&#xff08;如Raster Clipping&#xff09;操作简便&#xff0c;允许用户使用矢量图层作为裁剪掩膜&#xff0c;灵活定义裁剪区域。基于QGIS对相关数据依据边界进行裁剪&#xff0c;可以更好地进行数据可视化展示…