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

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

十五、搜索

访问 www.coding-time.cn 阅读原文动画效果,体验更佳。

1. 二分查找

在计算机科学中,二分查找(Binary Search),也称为折半查找、对数查找或二分法,是一种用于在有序数组中查找目标值位置的搜索算法。二分查找将目标值与数组的中间元素进行比较;如果它们不相等,则可以排除目标值不可能存在的一半,并在剩余的一半上继续搜索,直到找到目标值或搜索结束。如果搜索结束时剩余的一半为空,则表示数组中不存在目标值。

 

image.png

 

1复杂度

时间复杂度:O(log(n)) - 因为每次迭代都将搜索区域分成两半。

2完整实现

function binarySearch(array, target) {
  let left = 0;
  let right = array.length - 1;
  while (left <= right) {
    const mid = left + Math.floor((right - left) / 2);
    if (array[mid] === target) {
      return mid; // 找到目标元素,返回索引
    } else if (array[mid] < target) {
      left = mid + 1; // 目标元素在右侧,调整左边界
    } else {
      right = mid - 1; // 目标元素在左侧,调整右边界
    }
  }
  return -1; // 未找到目标元素}

3参考资料

  • 维基百科
  • YouTube

2.插值查找

插值查找(Interpolation Search)是一种用于在已按键(键值)排序的数组中搜索键的算法。

 

例如,我们有一个排序的数组 arr[],其中包含 n 个均匀分布的值,并且我们需要编写一个函数在数组中搜索特定元素 x

 

线性搜索的时间复杂度为 O(n),跳跃搜索的时间复杂度为 O(√n),二分查找的时间复杂度为 O(logn)

 

插值查找是对二分查找的改进,适用于在已排序数组中元素的分布是“均匀”的情况。二分查找总是检查中间元素。而插值查找根据所搜索的键的值可能接近的位置进行搜索。例如,如果键的值更接近最后一个元素,则插值查找可能从末尾开始搜索。

 

要找到要搜索的位置,它使用以下公式:

 

// 这个公式的思想是,当要搜索的元素更接近 arr[hi] 时,返回较大的 pos 值。
// 当更接近 arr[lo] 时,返回较小的值。
pos = lo + ((x - arr[lo]) * (hi - lo) / (arr[hi] - arr[lo]))
arr[] - 需要进行搜索的数组
x - 要搜索的元素
lo - arr[] 中的起始索引
hi - arr[] 中的结束索引

1复杂度

时间复杂度:O(log(log(n)))


带你读《图解算法小抄》十五、搜索(2)https://developer.aliyun.com/article/1348121?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皇后问题、判断有效数独、解数独