返回
二分查找: 一种高效的查找算法
后端
2023-10-13 17:57:58
二分查找算法是一种高效的查找算法,它通过不断将搜索范围减半来查找排序数组中的目标值。这种算法的时间复杂度为 O(log n),其中 n 是数组的长度。在本文中,我们将介绍三种类型的二分查找变体:
- 查找单个值 :
这种最常见的二分查找用于在排序数组中查找一个给定的值。算法从数组的中间元素开始,并将数组划分为两半。如果目标值在左半部分,则算法继续在左半部分进行搜索;否则,算法在右半部分进行搜索。这个过程不断重复,直到找到目标值或确定目标值不存在。
- 查找满足条件的左边界 :
这种二分查找用于查找满足特定条件的元素的最左边的元素。算法从数组的中间元素开始,并将数组划分为两半。如果满足条件的元素在左半部分,则算法继续在左半部分进行搜索;否则,算法在右半部分进行搜索。这个过程不断重复,直到找到满足条件的最左边的元素或确定这样的元素不存在。
- 查找满足条件的右边界 :
这种二分查找用于查找满足特定条件的元素的最右边的元素。算法从数组的中间元素开始,并将数组划分为两半。如果满足条件的元素在右半部分,则算法继续在右半部分进行搜索;否则,算法在左半部分进行搜索。这个过程不断重复,直到找到满足条件的最右边的元素或确定这样的元素不存在。
二分查找算法的优点是速度快,时间复杂度为 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
希望这篇文章对您有所帮助。如果您有任何问题,请随时提出。