二分查找算法示例

⚡ 智能摘要

二分查找算法通过不断将搜索范围减半,并将目标元素与中间元素进行比较,从而在已排序列表中找到目标元素。它也被称为半区间查找或对数查找,其速度远快于逐个扫描每个元素。

  • ???? 已排序数据: 二分查找仅适用于已排序的列表。
  • ➗ 减半: 每一步都将目标与中间值进行比较,并舍弃一半的范围。
  • ⚡ 对数: 该搜索的运行时间为 O(log n),比线性搜索快得多。
  • 🎯 中间索引: 中间值等于(左 + 右)除以 2 所得的最小值。
  • 🔁 迭代: 该过程重复进行,直到找到元素或范围为空为止。

二分查找算法示例

在学习二分查找之前,我们先来了解一下什么是查找。

什么是搜索?

搜索是一种实用程序,可让用户查找数据库中保存的文档、文件、媒体或任何其他类型的数据。搜索的工作原理很简单,就是将条件与记录匹配并将其显示给用户。这样,最基本的搜索功能就可以正常工作。

什么是二分搜索?

二分查找是一种高级搜索算法,用于从已排序的列表中查找和获取数据。其核心工作原理是将列表中的数据分成两半,直到找到所需值并将其显示在搜索结果中。二分查找通常被称为…… 半区间搜索 或者 对数搜索.

二分查找如何工作?

二分查找的工作方式如下:

  • 搜索过程首先定位已排序数据数组的中间元素。
  • 之后,将键值与元素进行比较。
  • 如果键值小于中间元素,则搜索会分析较大的值与中间元素进行比较和匹配。
  • 如果键值大于中间元素,则搜索会分析较小的值与中间元素进行比较和匹配。

二分查找算法(伪代码)

二分查找可以写成一个简短的迭代程序。它维护两个指针,low 和 high,并不断缩小范围,直到找到目标或范围为空为止。

binarySearch(array, target)
    low = 0
    high = length(array) - 1
    while low <= high
        mid = (low + high) / 2      // floor value
        if array[mid] == target
            return mid
        else if array[mid] < target
            low = mid + 1
        else
            high = mid - 1
    return -1              // target not found

该例程在成功时返回目标索引,在目标不存在时返回 -1。由于每次遍历范围减半,因此循环最多运行 log₂(n) 次。

二分查找示例

我们来看一个字典的例子。如果你需要查找某个单词,没有人会按顺序浏览每个单词,而是随机找到最近的单词来搜索所需的单词。

二分查找示例

上图说明了以下内容:

  1. 您有一个 10 位数字的数组,需要找到元素 59。
  2. 所有元素都用 0 到 9 的索引标记。现在,我们需要计算数组的中间值。为此,取索引最左边和最右边的值,然后将它们除以 2。结果是 4.5,但我们取向下取整的值。因此,中间值是 4。
  3. 该算法删除了从中间(4)到下限的所有元素,因为 59 大于 24,现在数组只剩下 5 个元素。
  4. 现在,59 大于 45 且小于 63。中间值是 7。因此,右侧索引值变为中间值减 1,等于 6,左侧索引值保持不变,仍为 5。
  5. 此时,您知道 59 在 45 之后。因此,左边的索引 5 也成为中间。
  6. 这些迭代持续到数组减少到只有一个元素,或者要查找的项目成为数组的中间。

例子2

让我们来看下面的例子来理解二分查找的工作原理。

二分查找示例

  1. 您有一个排序好的数组,其值范围是从 2 到 20,您需要找到 18。
  2. 下限和上限的平均值为 (l + r) / 2 = 4。所查找的值大于中位数 4。
  3. 小于中间值的数组值将被排除在搜索范围之外,大于中间值 4 的值将被搜索。
  4. 这是一个循环的划分过程,直到找到实际要搜索的项目。

为什么我们需要二分查找?

以下原因使得二分查找成为更佳的搜索算法选择:

  • 无论数据量大小,二分查找对已排序的数据都能高效运行。
  • 二进制算法不是按顺序遍历数据进行搜索,而是随机访问数据以查找所需元素。这使搜索周期更短且更准确。
  • 二分查找根据排序原则对已排序的数据进行比较,而不是使用相等性比较,后者速度较慢且大多不准确。
  • 每次搜索循环结束后,算法都会将数组的大小减半;因此,在下一次迭代中,它将只处理数组的剩余一半。

请学习我们的下一个教程 线性搜索: Python, C++ 例如:.

二分查找与线性查找

二分查找和线性查找是查找集合中值的两种最常用方法。下表突出了它们的区别:

方面 二进制搜索 线性搜寻
数据要求 需要已排序的数据 适用于已排序或未排序的数据
付款方式 每一步将搜索范围减半 按顺序检查每个元素
时间复杂度 O(log n) O(N)
最适合 大型、已排序的数据集 小型或未分类的数据集

简而言之,二分查找在大规模有序数据上速度快得多,而线性查找更简单,并且是数据未排序时的唯一选择。

常见问题

二分查找为人工智能系统背后的有序结构提供了快速查找能力,例如查找阈值、在一定范围内调整超参数或在已排序的嵌入索引中定位值。其 O(log n) 的速度保证了这些查找的高效性。

是的。人工智能助手可以编写迭代或递归二分查找算法。 Python, Java 或 C++ 从简单的描述来看。计算中间索引时,要注意经典的差一错误和溢出错误,并使用边界情况进行测试。

二分查找的时间复杂度为 O(log n),因为它每次比较都会将搜索范围减半。由于调用栈的存在,其空间复杂度对于迭代版本为 O(1),对于递归版本为 O(log n)。

不。二分查找依赖于已排序的数据,以便决定舍弃哪一半。对于未排序的数据,必须先对其进行排序,或者使用线性查找,线性查找会按顺序检查每个元素。

总结一下这篇文章: