为什么二分查找要取中点作为每次的划分点

我昨天突然想到了一个问题,为什么二分查找,每次都要以中点作为区间的划分?也就是只能划分成[0, 1/2 * k),[1/2 * k, n)两个选择区间?
我在想以1/4点划分不行吗?也就是[0, 1/4 * k),[1/4 * k, n),我要么选左1/4空间,要么选右3/4空间?这样貌似也大体上没什么问题?
于是写程序验证之,发现并不行。于是分析了一下其中原理。

二分法结果期望

其实原因是这样的,我们进行二分查找,对结果的期望是这样的?没错,我们希望结果收敛到某个点上。在思考最常见的二分查找情景时,可能对这个没太多体会。但其实什么时候结束查找,也就是循环的结束条件这一处,也是体现了这个思想的。
循环结束意味着什么?没错,这个过程已经异常了,正常过程已经完结。我们会以异常和正常的边界作为结束条件。那么二分查找中,正常过程的边界是什么呢?就区间收敛到一个点上。对照着代码来说明吧。

	int l = lbound, r = rbound;
	int mid;
	 //当l == r时意味着什么?没错,区间收敛到一个点上了。
	 //那么l > r意味着什么?已经不可描述了,不是正常过程范围内了。
	while (l <= r)
	{
		mid = l + (r-l)/2;
		if (check(mid))
			l = mid + 1;
		else
			r = mid - 1;
	}

总结一下我们对二分法的结果期望:

  • 排除掉中间就查找成功的退出情况,我们对整个流程最终状态,也就是正常过程边界的期望是,区间最终能收敛到一个点上
区间收敛到点,和以中点划分的关联

二分有两种情况,本质上是一样的,那就是:

  • 区间的二分;
  • 区间长度的二分(如找两有序数组,合并后前k小中某种解法);

在这个部分,用长度的二分来进行说明,这样会更好懂。

//我们的目标是区间长度收敛到1,也就是区间中只有1个数
//可以试试,只有采用1/2的时候,是必定可以收敛(结束循环)
//使用1/4、1/3之类不是确定收敛到1的
while(1 != k)
{
	k = k - 1/2 * k;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二分查找,也称折半查找,相较于线性查找具有显著的优势。二分查找的优势主要体现在**时间复杂度、前提条件和查找过程**等方面。具体分析如下: 1. **时间复杂度** - **二分查找**:时间复杂度为O(log2n),随着数据量的增加,所需查找的时间增长较慢。 - **线性查找**:时间复杂度为O(n),在最坏的情况下需要遍历整个数组来找到目标元素或确定元素不存在。 2. **前提条件** - **二分查找**:必须作用于一个已排序的数组或集合,因为算法依赖于元素的有序性来分割搜索区间。 - **线性查找**:不需要元素预先排序,适用于无序或有序的数据结构。 3. **查找过程** - **二分查找**:查找过程中不断将数组分成两半,比较中间值与待查找值的大小,从而决定是查找左半部分还是右半部分。 - **线性查找**:逐个检查元素直至找到目标值或遍历完全部元素。 4. **效率对比** - **二分查找**:在大量数据中查找时效率远高于线性查找,尤其是在数据量巨大时,二分查找的效率优势更为明显。 - **线性查找**:在小型数据集或无序数据集中可能更简便,但在大型数据集上效率较低。 5. **实现复杂度** - **二分查找**:实现较为复杂,涉及到计算中点、比较和递归或循环逻辑。 - **线性查找**:实现简单,通常只需要一层循环即可完成查找。 6. **适用场景** - **二分查找**:最适合处理静态有序的数据集。 - **线性查找**:适用于数据量不大或者实时更新较多的场合。 7. **空间复杂度** - **二分查找**:由于是递归,空间复杂度在最坏情况下可达到O(n),若用循环则可以降低到O(1)。 - **线性查找**:空间复杂度为O(1),不需要额外的存储空间。 8. **数据依赖性** - **二分查找**:对数据的有序性有严格要求。 - **线性查找**:不受数据是否有序的影响。 总的来说,二分查找在效率上通常优于线性查找,特别是在处理大数据集时。然而,它的前提是数据必须是有序的,而线性查找对数据顺序没有要求。在选择查找算法时,应考虑数据集的大小和有序性,以及实际的应用需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值