关于二分法的个人见解

关于二分法的一些理解

一般而言,我们在使用二分法的时候通常定义一个low一个high然后去求mid,在此就出现了第一个问题:
  1. 如何保证在求取过程中不会出现数据的溢出?
  我们采用的方法是(high-low)/2+low,其与(high+low)/2得到的结果是一样的。
  2. 在进行二分检索的时候我们让mid指针偏向中间的左侧还是中间的右侧?
  在我个人看来,我通常认为偏左侧和偏右侧一样,对于偏左侧而言无非就是采用如下代码:

	mid=(high-low)/2+low;
	if(target<A[mid]) high=mid-1;
	else if(target>A[mid]) low=mid+1;
	else return;

对于偏右侧而言是采用如下代码:

	mid=(high-low+1)/2+low;
	if(target<A[mid]) high=mid-1;
	else if(target>A[mid]) low=mid+1;
	else return;

然而,在今天做leetcode上面的一个题目的时候,我发现并不是这样的。有时候找到目标之后还不知道当前已经找到目标,需要继续往下走一步才能知道我们已经找到目标了,如果我们仍然采用上述思想,那我们就需要另外一个变量去维护上一步的结果,但是如果我们采用下面两种算法就不需要额外的变量。
对于中间偏右而言,只需要如下修改代码:

  	while(没有找到结果){
  		mid=(high-low+1)/2+low;
  		if(target<A[mid]) high=mid-1;
  		else low=mid;
  	}
  	return mid;

而对于中间偏左,我们则没有办法实现。其实,这种写法更加具有通用性,即使我们能够确定当前的mid不是我们要的结果,我们仍然可以把他赋值给low或者high,这样我们复杂度仍然为O(nlogn)但是却更加具有普遍性。所以,进行而分检索的时候我们还是让mid处于中间偏右的位置更好。
个人感觉:(在做一些其他算法的时候似乎也是在中间有两个数的时候选择右侧的似乎更好一些。)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二分查找法是一种在有序数组中查找特定元素的算法。 ```python def binary_search(arr, x): low = 0 high = len(arr) - 1 mid = 0 while low <= high: mid = (high + low) // 2 # If x is greater, ignore left half if arr[mid] < x: low = mid + 1 # If x is smaller, ignore right half elif arr[mid] > x: high = mid - 1 # x is present at mid else: return mid # If we reach here, then the element was not present return -1 ``` 这是一个在 Python 中实现二分查找的示例代码。它接受一个有序数组和一个要查找的元素作为参数,并返回该元素的索引。如果元素不存在,则返回 -1。 ### 回答2: 二分法是一种常用的查找算法,适用于排序好的数组或列表。下面是一个使用二分法查找某个元素的示例代码: ```python 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 # 示例数据 arr = [1, 3, 5, 7, 9, 11, 13] target = 7 # 调用二分法查找函数 result = binary_search(arr, target) if result != -1: print("目标元素在数组中的索引为: ", result) else: print("目标元素不在数组中") ``` 以上代码首先定义了一个名为`binary_search`的函数,它接受一个有序数组`arr`和一个目标元素`target`作为参数。在函数内部,通过设定`low`和`high`的初始值为数组的首尾索引,然后通过迭代比较中间元素`mid`和目标元素`target`的大小。如果`arr[mid]`等于`target`,则返回该元素的索引。如果`arr[mid]`小于`target`,则将`low`更新为`mid + 1`,否则将`high`更新为`mid - 1`。循环继续直到找到目标元素或者`low`大于`high`。最后返回-1表示目标元素不在数组中。 在示例数据中,我们定义了一个有序数组`arr`和要搜索的目标元素`target`为7。通过调用`binary_search`函数查找目标元素的索引,然后根据返回的结果判断目标元素是否在数组中,并进行相应的输出。 ### 回答3: 二分法是一种常用的查找算法,它通过将查找范围逐步缩小来快速定位目标元素的位置。以下是一个关于二分法的代码示例: ```python def binary_search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid if arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` 这段代码接受两个参数:一个有序的数组 `arr` 和一个目标元素 `target`。接下来,我们使用两个指针 `left` 和 `right` 来确定查找范围。在每次迭代中,我们计算中间元素的索引 `mid`,如果 `arr[mid]` 等于目标元素 `target`,则直接返回 `mid`。如果 `arr[mid]` 小于目标元素 `target`,则将 `left` 指针更新为 `mid + 1`,继续在右半边进行查找。如果 `arr[mid]` 大于目标元素 `target`,则将 `right` 指针更新为 `mid - 1`,继续在左半边进行查找。当 `left > right` 时,说明目标元素不在数组中,返回 -1。 使用该二分查找算法,您可以快速在有序数组中查找目标元素的索引,或者判断目标元素是否存在于数组中。请根据具体的需求调用该函数,并将数组和目标元素作为参数传入即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值