📜  Python的二进制搜索(1)

📅  最后修改于: 2023-12-03 14:46:45.645000             🧑  作者: Mango

Python的二分搜索

在计算机科学中,二分查找(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search)是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某个步骤数组为空,则代表找不到。这种搜索算法每次比较都使搜索范围缩小一半。

实现

我们来看一下用Python编程如何实现二分搜索。

首先,定义一个函数来执行二分搜索。该函数需要接受一个有序列表(sorted list)和要查找的目标值(target value)作为参数。这个函数将返回目标值在列表中的索引位置(index)。

def binary_search(arr, target):
    """二分搜索"""
    low = 0  # 定义第一个元素的下标
    high = len(arr) - 1  # 定义最后一个元素的下标

    while low <= high:
        mid = (low + high) // 2  # 找出中间元素的下标
        guess = arr[mid]  # 获取中间元素的值

        if guess == target:  # 判断目标值是否与中间元素相等
            return mid  # 如果相等,则返回中间元素的下标
        elif guess > target:  # 判断目标值是否小于中间元素的值
            high = mid - 1  # 如果小于,则将high减少到中间元素的下标-1
        else:
            low = mid + 1  # 如果大于,则将low增加到中间元素的下标+1

    return None  # 如果没有找到目标元素,则返回None

让我们来看一下这个函数是如何工作的。

我们定义了一个有序列表arr和一个目标值target值。然后,我们调用二分搜索函数binary_search,并将列表和目标值作为参数传递给它。

函数开始执行时,首先设置数组中第一个元素的下标和最后一个元素的下标:

low = 0
high = len(arr) - 1

然后,函数一直在while循环中运行,直到找到目标元素或搜索到整个数组而没有找到目标元素。

在每一次迭代中,找出中间元素的下标:

mid = (low + high) // 2

获取中间元素的值:

guess = arr[mid]

然后,比较中间元素的值(guess)与目标值(target):

if guess == target:
    return mid
elif guess > target:
    high = mid - 1
else:
    low = mid + 1

如果猜测的值等于目标值,则我们找到了目标元素,函数将返回中间元素的索引位置。

如果猜测的值大于目标值,则我们将high减少到中间元素的下标-1。

如果猜测的值小于目标值,则我们将low增加到中间元素的下标+1。

如果在while循环中没有找到目标元素,则函数将返回None。

应用

二分搜索是一种非常有用的搜索算法,在许多问题中都可以得到应用。例如:

  • 在排序数组中查找元素
  • 查找最大值或最小值的位置
  • 计算函数的零点

二分搜索还可以用于解决一些更复杂的问题,如计算凸多边形(convex polygon)的最小包围球(minimum bounding sphere)。

总结

在本文中,我们介绍了Python中的二分搜索算法。我们定义了一个函数来执行二分搜索,并解释了该函数的工作原理。我们还讨论了二分搜索的应用,以及它如何解决一些更复杂的问题。