笔者介绍:姜雪伟,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-跳跃搜索算法相关推荐

  1. JavaScript实现depth First Search深度优先搜索算法(附完整源码)

    JavaScript实现depth First Search深度优先搜索算法(附完整源码) depthFirstSearch.js完整源代码 depthFirstSearch.js完整源代码 func ...

  2. JavaScript实现breadth First Search广度优先搜索算法(附完整源码))

    JavaScript实现breadth First Search广度优先搜索算法(附完整源码) LinkedListNode.js完整源代码 Comparator.js完整源代码 LinkedList ...

  3. JavaScript实现Linear search线性搜索算法(附完整源码)

    JavaScript实现Linear search线性搜索算法(附完整源码) Comparator.js完整源代码 linearSearch.js完整源代码 linearSearch.test.js完 ...

  4. C++Jump Search跳转搜索的实现算法(附完整源码)

    C++Jump Search跳转搜索的实现算法 C++Jump Search跳转搜索的实现算法完整源码(定义,实现,main函数测试) C++Jump Search跳转搜索的实现算法完整源码(定义,实 ...

  5. C语言实现跳转搜索jump search算法(附完整源码)

    跳转搜索jump search算法 跳转搜索jump search算法的完整源码(定义,实现,main函数测试) 跳转搜索jump search算法的完整源码(定义,实现,main函数测试) #inc ...

  6. C语言实现linear search线性搜索算法(附完整源码)

    实现linear search线性搜索算法 linear search线性搜索算法的完整源码(定义,实现,main函数测试) linear search线性搜索算法的完整源码(定义,实现,main函数 ...

  7. Python:实现ternary search三元搜索算法(附完整源码)

    Python:实现ternary search三元搜索算法 from __future__ import annotations precision = 10def lin_search(left: ...

  8. Java:实现Ternary search三元搜索算法(附完整源码)

    Java:实现Ternary search三元搜索算法 package com.williamfiset.algorithms.search;import java.util.function.Dou ...

  9. Python:实现similarity search相似性搜索算法(附完整源码)

    Python:实现similarity search相似性搜索算法 from __future__ import annotationsimport mathimport numpy as npdef ...

最新文章

  1. R语言广义线性模型函数GLM、R中有几种logistic回归扩展和变异、robust包中的glmRob函数鲁棒logistic回归、ms包中的lrm函数拟合序数逻辑回归
  2. Express中间件--connect-mongodb-session
  3. 成功解决SQL server服务,远程过程调用失败
  4. 在Windows2012R2中如何安装IIS8.5
  5. 【 Grey Hack 】记一次被黑经历
  6. LeetCode 1191. K 次串联后最大子数组之和(前缀和+分类讨论)
  7. 令人失望的IE7Beta,仍然不支持Web标准。
  8. dubbo 服务压测_Dubbo高性能网关--Flurry介绍
  9. java语言c语言基础_新手入门选什么:有些人说C语言要比Java更难!你应该怎么办?...
  10. 小肽相关1~peptidomic discovery of short open reading frame–encoded peptides in human cells
  11. leetcode最小面积_LeetCode 题解 |力扣杯 LCP 13.寻宝
  12. 【STC15】通过PWM波实现呼吸灯效果
  13. cad断点快捷键_CAD如何打断?CAD打断点和CAD打断命令操作方法
  14. MarkDown思维导图
  15. 博客园主题美化(仅兼容 Markdown)
  16. android 视频通话框架,Android基于腾讯云实时音视频仿微信视频通话最小化悬浮
  17. 使用VIM是一种信仰
  18. 清空数据库所有表中的数据
  19. 杭电oj HDOJ 2072 单词数
  20. 传入和传出电子邮件服务器,直接归档传入和传出的电子邮件【MDaemon篇】

热门文章

  1. D盾安装使用及D盾免杀
  2. 新华字典 mysql数据库_GitHub - mysqlsc/chinese-xinhua: 中华新华字典数据库。包括歇后语,成语,词语,汉字。提供新华字典API。...
  3. C#添加美化包样式 索引的制作,NavMenu组件与TabControl添加页面
  4. HarmonyOS(鸿蒙)运动手表第二个小游戏app——数字华容道
  5. 从txt文件逐行读取多个关键字,并在文件中搜索该关键字的shell脚本
  6. WIFI大师分销系统小程序源码+流量主+详细搭建视频教程
  7. 64位win7下,plsql连接64位数据库时提示initialization error,已解决
  8. cad在线转换_CAD批量转PDF?分享两种方法,一分钟完成所有图纸转换!
  9. linux分区之ext2,ext3,ext4,gpt
  10. 《浅谈Cache Memory》 学习-第四章