返回

轻松掌握二分搜索变体,探索数据查找新境界

闲谈

当然,我很乐意分享更多关于二分搜索变体的知识。让我们探索一下这三个统一的方法。

基础二分搜索

基础二分搜索是二分搜索最基本的变体,它适用于在有序数组中查找一个特定元素。算法的原理是将数组分成两半,然后比较目标元素与中间元素。如果目标元素等于中间元素,则搜索结束,目标元素已找到。如果目标元素小于中间元素,则递归地搜索前半部分数组。如果目标元素大于中间元素,则递归地搜索后半部分数组。

def binary_search(arr, target):
    low = 0
    high = len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

寻找左侧边界

寻找左侧边界变体适用于在有序数组中查找一个元素的第一个出现位置。算法的原理是,如果目标元素存在于数组中,则其左侧一定存在一个比它小的元素。因此,我们可以递归地搜索数组的前半部分,直到找到目标元素的左侧边界。

def find_left_boundary(arr, target):
    low = 0
    high = len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            if mid == 0 or arr[mid - 1] < target:
                return mid
            else:
                high = mid - 1
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

寻找右侧边界

寻找右侧边界变体适用于在有序数组中查找一个元素的最后一个出现位置。算法的原理是,如果目标元素存在于数组中,则其右侧一定存在一个比它大的元素。因此,我们可以递归地搜索数组的后半部分,直到找到目标元素的右侧边界。

def find_right_boundary(arr, target):
    low = 0
    high = len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            if mid == len(arr) - 1 or arr[mid + 1] > target:
                return mid
            else:
                low = mid + 1
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

通过探索二分搜索的三个变体,我们进一步了解了算法的多样性和适用性。无论是在基础查找、寻找左侧边界还是寻找右侧边界,二分搜索都能展现出高效、简洁的特性。下次面对有序数组查找问题时,不妨考虑使用二分搜索,领略其算法之美。