📜  ricerca binaria (1)

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

二分查找(Binary Search)

二分查找又称二分法,是一种快速查找有序数组的算法。其基本思想是将目标值与数组中间的值进行比较,如果目标值小于中间值,则在数组的左半部分继续查找;如果目标值大于中间值,则在数组的右半部分继续查找。通过不断缩小查找范围,最终可以找到目标值。

算法实现

下面是一个基于递归的二分查找算法实现:

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

该算法接受一个有序数组 arr,以及目标值 target,并返回目标值在数组中的下标,如果目标值不在数组中,返回 -1

算法首先计算数组的中间下标 mid,然后将目标值与 mid 对应的数组元素进行比较。如果目标值等于该元素,算法直接返回 mid;如果目标值比该元素小,算法在数组的左半部分继续查找;如果目标值比该元素大,算法在数组的右半部分继续查找。

算法使用递归实现,直到找到目标值或者查找范围缩小到空集。如果找到目标值,直接返回对应的下标;否则返回 -1

算法分析

二分查找算法的时间复杂度为 $O(\log n)$,其中 $n$ 是数组的大小。算法的空间复杂度为 $O(\log n)$,因为每次递归调用都会消耗一些栈空间。如果实现为非递归形式,空间复杂度可以优化到 $O(1)$。

算法的关键是维护查找范围的上下界,每次查找可以将查找范围缩小为一半。因此,二分查找适用于已知数组是有序的情况下,对于无序数组无法应用。二分查找还需要数组支持随机访问,因此不适用于链表等不支持随机访问的数据结构。

总结

二分查找是一种快速查找有序数组的算法,时间复杂度为 $O(\log n)$。算法的核心思想是维护查找范围的上下界,通过不断缩小查找范围,最终可以找到目标值。二分查找适用于已知数组是有序的情况下,对于无序数组无法应用。