带你读《图解算法小抄》十五、搜索(3)

简介: 带你读《图解算法小抄》十五、搜索(3)

带你读《图解算法小抄》十五、搜索(2)https://developer.aliyun.com/article/1348121?groupCode=tech_library


3.跳跃搜索


跳跃搜索(Jump Search)又称为块搜索(Block Search),是一种用于已排序数组的搜索算法。其基本思想是通过固定的步长跳跃或跳过一些元素,而不是搜索所有元素,从而检查较少的元素(相比于线性搜索)。

 

例如,假设我们有一个大小为 n 的数组 arr[],以及一个块大小 m。我们在索引 arr[0]arr[m]、arr[2 * m]、...、arr[k * m] 等处进行搜索。一旦我们找到区间 arr[k * m] < x < arr[(k+1) * m],我们在索引 k * m 开始执行线性搜索操作,以找到元素 x

 

什么是最优的块大小? 在最坏的情况下,我们需要进行 n/m 次跳跃,如果最后一个检查的值大于要搜索的元素,则我们还需要进行 m - 1 次比较进行线性搜索。因此,在最坏情况下,总的比较次数为 ((n/m) + m - 1)。当 m = √n 时,函数 ((n/m) + m - 1) 的值最小。因此,最佳的步长大小是 m = √n

1复杂度

时间复杂度:O(√n) - 因为我们按块大小 √n 进行搜索。

2完整实现

function jumpSearch(array, target) {
  const n = array.length;
  const blockSize = Math.floor(Math.sqrt(n));
  let step = blockSize;
  let prev = 0;
  // 跳跃定位目标值的可能范围
  while (array[Math.min(step, n) - 1] < target) {
    prev = step;
    step += blockSize;
    if (prev >= n) {
      return -1; // 目标值不在数组中
    }
  }
  // 在目标值的可能范围内进行线性搜索
  while (array[prev] < target) {
    prev++;
    if (prev === Math.min(step, n)) {
      return -1; // 目标值不在数组中
    }
  }
  // 检查找到的元素是否是目标值
  if (array[prev] === target) {
    return prev; // 找到目标值,返回索引
  }
  return -1; // 未找到目标值}

3参考资料

  • GeeksForGeeks
  • Wikipedia


带你读《图解算法小抄》十五、搜索(4)https://developer.aliyun.com/article/1348119?groupCode=tech_library

相关文章
|
12天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
19 4
|
12天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
16 1
|
15天前
|
存储 算法 Java
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
广度优先搜索(Breadth-First Search,BFS)是一种用于图的遍历或搜索的算法。
|
18天前
|
算法 JavaScript 决策智能
基于禁忌搜索算法的TSP路径规划matlab仿真
**摘要:** 使用禁忌搜索算法解决旅行商问题(TSP),在MATLAB2022a中实现路径规划,显示优化曲线与路线图。TSP寻找最短城市访问路径,算法通过避免局部最优,利用禁忌列表不断调整顺序。关键步骤包括初始路径选择、邻域搜索、解评估、选择及禁忌列表更新。过程示意图展示搜索效果。
|
5天前
|
机器学习/深度学习 算法
机器学习中的超参数优化涉及手动尝试、网格搜索、随机搜索、贝叶斯优化、梯度优化、进化算法等策略
【6月更文挑战第28天】**机器学习中的超参数优化涉及手动尝试、网格搜索、随机搜索、贝叶斯优化、梯度优化、进化算法等策略。工具如scikit-optimize、Optuna助力优化,迁移学习和元学习提供起点,集成方法则通过多模型融合提升性能。资源与时间考虑至关重要,交叉验证和提前停止能有效防止过拟合。**
11 0
|
2月前
|
索引
浅谈两个重要的搜索算法
【5月更文挑战第15天】线性搜索从数组一端按顺序遍历,直到找到目标元素,平均和最坏情况的时间复杂度均为O(N)。二分查找适用于排序数组,通过比较中间元素快速定位目标,最佳、平均和最坏情况的时间复杂度都是O(logN)。
20 6
|
12天前
|
算法 Python
二维矩形件排样算法之最低水平线搜索算法实现
二维矩形件排样算法之最低水平线搜索算法实现
13 0
|
15天前
|
人工智能 算法 Java
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。
|
19天前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
19天前
|
算法
【经典LeetCode算法题目专栏分类】【第3期】回溯问题系列:单词搜索、N皇后问题、判断有效数独、解数独
【经典LeetCode算法题目专栏分类】【第3期】回溯问题系列:单词搜索、N皇后问题、判断有效数独、解数独