数学逻辑上,二分法可以描述为以下步骤:
1. 确定初始搜索区间:假设有一个有序数组arr,需要在其中找到一个特定的元素target。初始时,搜索区间为整个数组,即[low, high](索引),其中low是数组的第一个元素,high是数组的最后一个元素。
2. 计算中点:在搜索区间[low, high]内,找到中间的元素mid,可以通过以下公式计算:
如果low和high的值都是整数,则mid是它们平均值的下取整。
3. 比较中点和目标值:将中点mid的值与目标值target进行比较:
如果mid的值等于target,则搜索成功,返回mid的索引。
如果mid的值大于target,则目标值在搜索区间的左半部分,即[low, mid - 1]。
如果mid的值小于target,则目标值在搜索区间的右半部分,即[mid + 1, high]。
4. 更新搜索区间:根据比较结果,将搜索区间更新为新的[low, high],并重复步骤2和3,直到找到目标值或者搜索区间为空。
5. 结束搜索:如果在搜索过程中找到了目标值,则搜索结束,返回目标值的索引。如果搜索区间为空,则表示目标值不在数组中,搜索失败。
二分法之所以高效,是因为它每次迭代都将搜索区间缩小一半,因此搜索过程会很快收敛。此外,由于数组是有序的,二分法可以确保在找到目标值之前不会检查数组中的每个元素,这使得它在处理大量数据时非常有效。
在算法中,进行二分法之前,可以建立指针(也就是一个初始角标):
题目:
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
- class Solution:
- def search(self, nums: List[int], target: int) -> int:
- left,right = 0, len(nums)-1
- # 当左指针小于右指针,继续
- while(left <= right):
- # 中间索引
- mid = (right - left)//2 + left
- # 获取中间位置
- num = nums[mid]
- if target==num:
- return mid
- elif num> target:
- right = mid-1
- else:
- left = mid +1
- return -1