算法——跳跃搜索

Jump Search-跳跃搜索算法 笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,优快云社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。优快云视频网址:http://edu.youkuaiyun.com/lecturer/144 最近在项目中要使用查找算法,正好利用这次机会,把算法再复习一遍,这次是利用跳跃查找算法解决问题。 Jump Se 阅读详情

像二进制搜索一样,跳跃搜索是排序数组的搜索算法。基本思想是通过固定步骤跳过或跳过某些元素代替搜索所有元素来检查较少的元素(而不是线性搜索)。

例如,假设我们有一个大小为n的数组arr []和块(要跳转)的大小m。然后我们搜索索引arr [0],arr [m],arr [2m] ... ..arr [km]等等。一旦我们找到间隔(arr [km]

我们考虑以下数组:(0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610)。数组的长度为16.跳跃搜索将以下列步骤找到55,假设要跳过的块大小为4.

步骤1:从索引0跳转到索引4;
步骤2:从索引4跳转到索引8;
步骤3:从索引8跳转到索引16;
步骤4:由于索引16处的元素大于55,因此我们将返回一步到索引9.
步骤5:从索引9执行线性搜索以获取元素55。
要跳过的最佳块大小是多少?
在最坏的情况下,我们必须进行n / m跳转,如果最后一个检查值大于要搜索的元素,则对线性搜索进行m-1比较。因此,最坏情况下的比较总数将为((n / m)+ m-1)。当m =√n时,函数((n / m)+ m-1)的值将是最小值。因此,最好的步长是m = √n。

// 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

输出:

Number 55 is at index 10

时间复杂度:O(√n)
辅助空间:O(1)

注意:

该查找只针对已经排序的数组。
要跳过的块的最佳大小是O(√n)。这使得跳跃搜索O(√n)的时间复杂度。
跳跃搜索的时间复杂度在线性搜索((O(n))和二进制搜索(O(Log n))之间。
二进制搜索比跳跃搜索更好,但跳转搜索具有我们仅遍历一次的优点(二进制搜索可能需要最多为0(Log n)跳转),考虑要搜索的元素是最小元素或小于最小的)。因此,在跳回成本高昂的系统中,我们使用Jump Search。


0046算法笔记——【随机化算法】舍伍德随机化思想解决跳跃表问题 问题描述      如果用有序链表来表示一个含有n个元素的有序集S,则在最坏情况下,搜索S中一个元素需要O(n)计算时间。提高有序链表效率的一个技巧是在有序链表的部分结点处增设附加指针以提高其搜索性能。在增设附加指针的有序链表中搜索一个元素时,可借助于附加指针跳过链表中若干结点,加快搜索速度。这种增加了向前附加指针的有序链表称为跳跃表。      应在跳跃表的哪些结点增加附加指针以及在该结点处 阅读详情

相关推荐

C++ Jump Search 跳跃搜索算法的实现

通过结合线性搜索和二分搜索的特点,Jump Search 能够在较小的时间复杂度下找到目标元素。在实际应用中,如果需要在有序数组中进行查找操作,可以考虑使用 Jump Search 算法来提高搜索效率。然后使用一个循环,在每次迭代中跳过步长个元素进行搜索,直到找到一个大于等于目标元素的元素或者超出数组范围。如果找到了大于目标元素的元素,就回退到上一个步长位置,然后使用线性搜索在该范围内查找目标元素。它结合了线性搜索和二分搜索的优点,能够在较小的时间复杂度下找到目标元素。在主函数中,我们创建了一个示例数组。

CyberWarpX的博客 240

跳跃搜索

像二进制搜索一样,跳跃搜索是排序数组的搜索算法。基本思想是通过固定步骤跳过或跳过某些元素代替搜索所有元素来检查较少的元素(而不是线性搜索)。 例如,假设我们有一个大小为n的数组arr []和块(要跳转)的大小m。然后我们搜索索引arr [0],arr [m],arr [2m] ... ..arr [km]等等。一旦我们找到间隔(arr [km] <x <arr [(k + 1)m])...

weixin_30387663的博客 310

JumpSearcher跳跃搜索算法的C#实现

JumpSearcher跳跃搜索算法是一种高效的查找算法,适用于已排序的数组。通过跳跃一定步长来定位搜索范围,可以在一定程度上减少比较次数,从而提高搜索效率。本文提供了JumpSearcher跳跃搜索算法的C#实现示例,希望能对你有所帮你有所帮助。

TechPr的博客 94

【查找算法】跳跃式搜索算法

问题描述 给定n个元素的数组,找到给定的元素的位置。 适用场景 当数组有序时,可以采用跳跃式搜索算法,可以减少一定数量的查找比对操作,整体复杂度为O(√n) (不如二分查找) 他的效率介于线性搜索和二分查找之间。当使用二分查找效率不高的时候,可以尝试使用跳跃式搜索。 执行步骤 设置一个block大小m,从index=0开始比对,如果较小则index = index + m,以此类推,直到查到元素。如果我们发现前一个比对值比目标值小,后一个比对值比目标值大,那么目标值肯定在这

『程序员·小李』的博客 826

Python实现Jump Search跳跃搜索算法

接着,在 while 循环中,我们不断跳跃步长值直到找到大于或等于目标值的元素,然后在当前步长区间内进行线性搜索,找到目标值并返回其下标,否则说明目标值不在数组中,返回 -1。该算法首先预定义一个步长,然后在数组中跳跃这个步长的值,直到找到大于或等于目标值的元素。程序输出:Element is present at index 3,表明目标值存在于数组的第 3 个位置上,与我们预期相符。Jump Search 的时间复杂度为 O(√n),比线性搜索和二分搜索的时间复杂度更快一些,但具有统一性较差的缺点。

. 536

跳跃搜索算法的C语言实现

它通过跳跃一定的步长来快速定位目标元素的范围,然后在该范围内执行线性搜索。接下来,我们在目标元素的范围内执行线性搜索,直到找到目标元素或者搜索范围结束。如果搜索范围结束仍未找到目标元素,则返回-1表示目标元素不在数组中。该算法可以在有序数组中高效地搜索目标元素,并且相对于简单的线性搜索算法具有更好的时间复杂度。然后,我们通过比较目标元素与当前步长所对应的数组元素的值,来确定目标元素的范围。在上面的代码中,我们首先计算跳跃的步长,这里使用了平方根函数。函数来执行跳跃搜索,并根据返回的结果输出相应的信息。

DevCharm的博客 110

搜索算法之跳跃搜索详细解读(附带Java代码解读)

跳跃搜索(Jump Search)是一种改进的查找算法,用于在已排序的数组中查找特定元素。它结合了线性搜索和二分搜索的特点,通过跳跃(即跳过一些元素)来提高搜索效率。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1066

C#实现JumpSearch跳跃搜索算法及完整源码

在代码中,我们先计算出块的大小,并将其作为每次跳跃的跨度。然后从数组的起始位置开始迭代,每次跳跃到下一个块的起始位置,直到目标值小于下一个块的最后一个元素或者越界为止。本文提供的JumpSearch算法实现比较简单,但已经可以有效地解决基本场景下的搜索问题。读者可以在此基础上进行更多的优化和扩展,以适应自己的实际需求。本文将介绍如何使用C#实现JumpSearch算法,同时提供完整的源代码示例。然后再在线性区间内查找目标值,如果找到目标值,返回其在数组中的位置,否则返回-1表示未找到。

BugHunterX的博客 124

三大经典查找(跳跃、插值、斐波那契)

查找和排序是数据结构与算法中不可或缺的一环,在这个专栏中我们会学习六大查找和十大排序,而本篇将详细讲解其中的三大经典查找——跳跃查找、斐波那契查找、插值查找

ZER00000001的博客 928

JPS跳跃点搜索算法Python完整实现与动态可视化项目

JPS的“跳跃”不是盲目长距离位移,而是受轴对齐约束与L∞范式等价性双重保障的定向推进。本节揭示其形式化内核:水平/垂直跳跃的步长收敛性、斜向跳跃的45°耦合条件、以及避免方向振荡的有限状态机调度。

weixin_42452924的博客 317

100个Python代码大全:学完这篇从Python小白到架构师

Python是一种广泛使用的高级编程语言,以其简洁优雅、易于学习和强大的库而闻名。无论你是一位经验丰富的程序员还是初学者,都可以从这种语言的丰富资源中受益。在本篇博客中,我将分享100个实用的Python代码示例,旨在帮助你掌握Python编程,并在日常工作中提高效率。

penggerhe的博客 1万+

零基础数据结构与算法——第四章:基础算法-搜索算法(跳跃)

跳跃搜索是一种针对有序数组的搜索算法,通过固定步长跳跃减少比较次数。其核心思想是先大步跳跃确定区间,再在线性搜索。最优步长为√n,时间复杂度O(√n)。相比线性搜索更快,比二分搜索更简单但稍慢,适用于单向链表等结构。实际应用包括数据库索引、文件系统搜索等场景。该算法结合了跳跃和线性搜索的优势,在特定情况下比传统搜索方法更高效。

qqxhb 资源共享 859

用ADS搞定CGH40010F的宽带连续F类功放:从阻抗计算到版图仿真的保姆级流程

本文详细介绍了使用ADS设计CGH40010F宽带连续F类功放的全流程,从阻抗计算到版图仿真。通过分析器件特性和理论基础,提供谐波阻抗匹配和版图协同验证的实用技巧,帮助射频工程师高效完成高效率功放设计。重点关注宽带连续F类功放的设计难点和调试方法,提升设计成功率。

weixin_29189377的博客 381

如何使用C语言实现跳跃搜索:固定步长的高效搜索算法全指南

在计算机科学领域,搜索算法是数据处理的基础工具。GitHub加速计划中的C语言算法库(gh_mirrors/c/C)提供了多种经典搜索算法的实现,其中跳跃搜索(Jump Search)以其独特的固定步长策略,在有序数组中实现了比线性搜索更高效的查找性能。本文将详细介绍跳跃搜索的工作原理、实现方法及实际应用,帮助开发者快速掌握这一实用算法。 ## 跳跃搜索:平衡效率与复杂度的搜索策略 跳跃搜索是

gitblog_00213的博客 350

大整数因数分解工具——yafu

可以将大整数放在一个新建文件中——data.txt,最后面一定要换行,不然会出现eof;done processing batchfile,运行命令。2.点击设置——系统——系统信息——高级系统设置——环境变量——点击PATH(上下都可以)——新建 添加yafu-x64.exe 所在路径——点击确定。,如果整数数过长,会出现错误mismatched parens;1.找到yafu-x64.exe 所在的文件路径。如果出现以下图像,说明配置成功。3.打开cmd,输入。

l2ohvef的博客 6156

【MATLAB/Simulink】从模型到飞行:基于PX4与Rflysim的无人机MBD实战指南

本文详细介绍了基于MATLAB/Simulink与PX4、Rflysim的无人机模型开发与飞行控制实战指南。通过MBD(基于模型设计)方法,从建模、仿真到代码生成与硬件部署,实现无人机开发的高效闭环。文章涵盖开发环境搭建、动力学建模、控制算法实现及测试验证全流程,为无人机开发者提供实用技巧与优化建议。

weixin_30181209的博客 410

【贪心算法】跳跃游戏

深搜 贪心算法 跳跃游戏

qq_52117903的博客 3397

[VT虚拟化驱动]正式启动VT

文章目录前言一、vmlaunch正式开始虚拟化二、使用步骤1.引入库2.读入数据总结 前言 本章开始真正实现一个最简单的VT框架,当然,只是能跑起来一个VT驱动了,没有并包括EPT,EPT后面再讲 提示:以下是本篇文章正文内容,下面案例可供参考 一、vmlaunch正式开始虚拟化 执行VMLAUNCH指令执行后,就正式进入虚拟化了,再该指令执行之前,得先保存Guest当前的环境,执行完VMLAUNCH后,要恢复Guest的环境,让Guest就像什么都没发生一样,所以需要保存和恢复Guest的各种寄存器的值

吾无法无天的博客 3663

BFS算法实战:从骑士跳跃问题解析最短路径搜索与代码实现

广度优先搜索(BFS)是解决无权图最短路径问题的经典算法,其核心原理是逐层遍历,确保首次到达目标节点时路径最短。在算法竞赛和工程实践中,BFS常用于解决迷宫探索、状态转移等场景,具有时间复杂度低、实现直观的技术价值。本文以USACO青铜组题目“Bronze Lilypad Pond”为例,深入探讨如何将跳跃规则建模为状态转移,通过队列实现高效搜索,并详细分析了**方向向量生成**和**访问标记**等关键实现细节,帮助读者掌握BFS在网格类问题中的标准化应用。

anwenzhao0749的博客 350

0 基础学前端:100 天拿 offer 实战课(第 16 天)—— JS 数组高级方法:数据处理效率翻倍,代码更简洁

方法名核心作用回调函数返回值返回结果适用场景map数据转换转换后的新元素新数组(长度与原数组一致)格式转换、新增字段、生成 DOM 字符串filter数据筛选true(保留)/false(过滤)新数组(符合条件的元素)筛选符合条件的元素(如未完成计划、今天的评论)reduce数据汇总新的累加值任意类型(数字、对象等)求和、计数、分组、多数据汇总find查找元素true(匹配)/false(不匹配)第一个匹配的元素 /undefined。

苏打水.X的博客 135

手把手教你学simulink(16.10)-- 基于Simulink的IIR滤波器(Infinite Impulse Response Filter)项目

基于Simulink的IIR滤波器(Infinite Impulse Response Filter)项目的详细实例介绍。这个项目将重点放在IIR滤波器的设计、实现和仿真上,帮助你理解和应用IIR滤波器在信号处理中的作用。

MHD0815的博客 707

一种跳跃重复段的字符搜索算法

下面是一个面试中出现的算法题目:给定两个字符串,用第二个字符串对第一个字符串做split 实现方式有多重,如何做到效率最优,大家可以发挥各自的创想。 下面算法在解决两个大字符串搜索问题,具有较好的效率。通过比较可以看出效率差异。 package com.uu.oxgen.tool; import com.alibaba.fastjson.JSON; import java.util.A...

270

WPS访问权限不足怎么解决??具体怎么操作?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 4176

学习记录:js算法(七十四):跳跃游戏II

动态规划的思路是维护一个数组 dp,其中 dp[i] 表示到达索引 i 所需的最小跳跃次数。我们可以通过遍历每个位置来更新后续位置的跳跃次数。这道题目的解决方案可以通过贪心算法来实现,核心思想是尽可能地让每次跳跃都能让我们到达更远的位置。BFS 可以用于寻找最短路径,因此我们可以将每个位置视为图中的节点,使用队列来进行广度优先搜索。DFS 也可以用来解决这个问题,但效率较低,因为它可能会遍历所有可能的路径。向前跳转的最大长度。生成的测试用例可以到达。处,你可以跳转到任意。

weixin_48677331的博客 1299

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: 曾经误入传销我和linux系统结下缘分
下一篇: 用蛮力法解决冒泡排序
linuxprobe2017
博客等级 码龄10年 123粉丝 294原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值