返回

二分查找: 一种高效的查找算法

后端

二分查找算法是一种高效的查找算法,它通过不断将搜索范围减半来查找排序数组中的目标值。这种算法的时间复杂度为 O(log n),其中 n 是数组的长度。在本文中,我们将介绍三种类型的二分查找变体:

  1. 查找单个值

这种最常见的二分查找用于在排序数组中查找一个给定的值。算法从数组的中间元素开始,并将数组划分为两半。如果目标值在左半部分,则算法继续在左半部分进行搜索;否则,算法在右半部分进行搜索。这个过程不断重复,直到找到目标值或确定目标值不存在。

  1. 查找满足条件的左边界

这种二分查找用于查找满足特定条件的元素的最左边的元素。算法从数组的中间元素开始,并将数组划分为两半。如果满足条件的元素在左半部分,则算法继续在左半部分进行搜索;否则,算法在右半部分进行搜索。这个过程不断重复,直到找到满足条件的最左边的元素或确定这样的元素不存在。

  1. 查找满足条件的右边界

这种二分查找用于查找满足特定条件的元素的最右边的元素。算法从数组的中间元素开始,并将数组划分为两半。如果满足条件的元素在右半部分,则算法继续在右半部分进行搜索;否则,算法在左半部分进行搜索。这个过程不断重复,直到找到满足条件的最右边的元素或确定这样的元素不存在。

二分查找算法的优点是速度快,时间复杂度为 O(log n)。这使得它非常适合用于查找大型数组中的元素。二分查找算法的缺点是需要数组是排序的。如果数组是无序的,则必须先对数组进行排序,然后才能使用二分查找算法。

下面是使用 Python 实现上述三种二分查找变体的示例代码:

def binary_search(arr, target):
    """
    查找单个值

    Args:
        arr: 排序数组
        target: 要查找的目标值

    Returns:
        目标值在数组中的索引,如果找不到则返回 -1
    """
    left, right = 0, len(arr) - 1
    while left <= right:
        mid = (left + right) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            left = mid + 1
        else:
            right = mid - 1
    return -1


def binary_search_left_boundary(arr, target):
    """
    查找满足条件的左边界

    Args:
        arr: 排序数组
        target: 要查找的目标值

    Returns:
        满足条件的最左边的元素的索引,如果找不到则返回 -1
    """
    left, right = 0, len(arr) - 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] < target:
            left = mid + 1
        else:
            right = mid
    if arr[left] == target:
        return left
    else:
        return -1


def binary_search_right_boundary(arr, target):
    """
    查找满足条件的右边界

    Args:
        arr: 排序数组
        target: 要查找的目标值

    Returns:
        满足条件的最右边的元素的索引,如果找不到则返回 -1
    """
    left, right = 0, len(arr) - 1
    while left < right:
        mid = (left + right) // 2
        if arr[mid] <= target:
            left = mid + 1
        else:
            right = mid
    if arr[right] == target:
        return right
    else:
        return -1

希望这篇文章对您有所帮助。如果您有任何问题,请随时提出。