Jump Search-跳跃搜索算法
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
最近在项目中要使用查找算法,正好利用这次机会,把算法再复习一遍,这次是利用跳跃查找算法解决问题。
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.跳跃搜索将以下列步骤找到值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。
我们这次使用java实现,代码如下所示:
// 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 jumpedint step = (int)Math.floor(Math.sqrt(n));// Finding the block where element is// present (if it is present)int prev = 0;while (arr[Math.min(step, n)-1] < x){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 foundif (arr[prev] == x)return prev;return -1;}// Driver program to test functionpublic 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 Searchint index = jumpSearch(arr, x);// Print the index where 'x' is locatedSystem.out.println("\nNumber " + x +" is at index " + index);}
}
运行结果分析:
时间复杂度:O(√n)
辅助空间:O(1)
算法小结:
一、该算法仅适用于有序数组
二、要跳转的最佳大小为O(√n), 这使得跳跃搜索O(√n)的时间复杂度。
三、跳跃搜索的时间复杂度在线性搜索((O(n))和二分查找搜索(O(Log n))之间。
四、二分查找算法相比跳跃搜索更好,但是跳跃搜索有以下优点:跳跃搜索仅遍历一次,而二分查找最多需要O(Log n),考虑要搜索的元素是最小元素或小于 最小的),我们选用Jump Search。
Jump Search-跳跃搜索算法相关推荐
- JavaScript实现depth First Search深度优先搜索算法(附完整源码)
JavaScript实现depth First Search深度优先搜索算法(附完整源码) depthFirstSearch.js完整源代码 depthFirstSearch.js完整源代码 func ...
- JavaScript实现breadth First Search广度优先搜索算法(附完整源码))
JavaScript实现breadth First Search广度优先搜索算法(附完整源码) LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList ...
- JavaScript实现Linear search线性搜索算法(附完整源码)
JavaScript实现Linear search线性搜索算法(附完整源码) Comparator.js完整源代码 linearSearch.js完整源代码 linearSearch.test.js完 ...
- C++Jump Search跳转搜索的实现算法(附完整源码)
C++Jump Search跳转搜索的实现算法 C++Jump Search跳转搜索的实现算法完整源码(定义,实现,main函数测试) C++Jump Search跳转搜索的实现算法完整源码(定义,实 ...
- C语言实现跳转搜索jump search算法(附完整源码)
跳转搜索jump search算法 跳转搜索jump search算法的完整源码(定义,实现,main函数测试) 跳转搜索jump search算法的完整源码(定义,实现,main函数测试) #inc ...
- C语言实现linear search线性搜索算法(附完整源码)
实现linear search线性搜索算法 linear search线性搜索算法的完整源码(定义,实现,main函数测试) linear search线性搜索算法的完整源码(定义,实现,main函数 ...
- Python:实现ternary search三元搜索算法(附完整源码)
Python:实现ternary search三元搜索算法 from __future__ import annotations precision = 10def lin_search(left: ...
- Java:实现Ternary search三元搜索算法(附完整源码)
Java:实现Ternary search三元搜索算法 package com.williamfiset.algorithms.search;import java.util.function.Dou ...
- Python:实现similarity search相似性搜索算法(附完整源码)
Python:实现similarity search相似性搜索算法 from __future__ import annotationsimport mathimport numpy as npdef ...
最新文章
- R语言广义线性模型函数GLM、R中有几种logistic回归扩展和变异、robust包中的glmRob函数鲁棒logistic回归、ms包中的lrm函数拟合序数逻辑回归
- Express中间件--connect-mongodb-session
- 成功解决SQL server服务,远程过程调用失败
- 在Windows2012R2中如何安装IIS8.5
- 【 Grey Hack 】记一次被黑经历
- LeetCode 1191. K 次串联后最大子数组之和(前缀和+分类讨论)
- 令人失望的IE7Beta,仍然不支持Web标准。
- dubbo 服务压测_Dubbo高性能网关--Flurry介绍
- java语言c语言基础_新手入门选什么:有些人说C语言要比Java更难!你应该怎么办?...
- 小肽相关1~peptidomic discovery of short open reading frame–encoded peptides in human cells
- leetcode最小面积_LeetCode 题解 |力扣杯 LCP 13.寻宝
- 【STC15】通过PWM波实现呼吸灯效果
- cad断点快捷键_CAD如何打断?CAD打断点和CAD打断命令操作方法
- MarkDown思维导图
- 博客园主题美化(仅兼容 Markdown)
- android 视频通话框架,Android基于腾讯云实时音视频仿微信视频通话最小化悬浮
- 使用VIM是一种信仰
- 清空数据库所有表中的数据
- 杭电oj HDOJ 2072 单词数
- 传入和传出电子邮件服务器,直接归档传入和传出的电子邮件【MDaemon篇】
热门文章
- D盾安装使用及D盾免杀
- 新华字典 mysql数据库_GitHub - mysqlsc/chinese-xinhua: 中华新华字典数据库。包括歇后语,成语,词语,汉字。提供新华字典API。...
- C#添加美化包样式 索引的制作,NavMenu组件与TabControl添加页面
- HarmonyOS(鸿蒙)运动手表第二个小游戏app——数字华容道
- 从txt文件逐行读取多个关键字,并在文件中搜索该关键字的shell脚本
- WIFI大师分销系统小程序源码+流量主+详细搭建视频教程
- 64位win7下,plsql连接64位数据库时提示initialization error,已解决
- cad在线转换_CAD批量转PDF?分享两种方法,一分钟完成所有图纸转换!
- linux分区之ext2,ext3,ext4,gpt
- 《浅谈Cache Memory》 学习-第四章