二分查找的几种模式

二分查找是一种非常基础的搜索方法,也具有固定的模板。
首先是朴素的二分查找方法,也就是在一堆排好序的数组中搜索一个数字(没有排好序也可以,可以自己手动排序):

首先是给定数组length[],数组a的长度n,以及查找的数字m,这时候只需要进行一下步骤就可以,这里的写法比较多种多样,但是要是理解了也万变不离其宗,首先是左右指针分别指到首位位置,之后进行二分循环,循环条件这里是写法可以不同的地方,但是写左边小等右边最后的结果一定是会出现左边right,右边left的结果,这里可以用来解决重复数的问题,假如一个数组是[1,1,1,1,0,0,0,0]控制条件可以将指针最后停在right指向最后一个1而left指向第一个0的位置。所以最后返回索引值的时候一定要观察好需要的是0值还是1值,也就是返回的是left值还是right值。但是不管怎样停下来时一定是right,left这样的形形式。

在这里插入图片描述
但是在存在其他的二分结构,当没有一个准确输出值的时候,仅通过大于或者小于来进行控制二分时又分为了两种情况。
这种复杂的二分法可以简化成两种模型,第一种就是当小于一个值时,结果都成立但是要求成立结果种的最值,也就是[1,1,1,1,0,0,0,0],1的位置代表事件成立,而0代表事件不成立,需要求最后一个成立的1的位置。

当事件成立,由于mid指针指向的可能是答案,所以只需要将左指针赋值为mid即可,而右指针指向的一定不是答案所以将mid - 1付上即可,这样得出的结果,无论是左边还是右边都是一样的。

但是这里需要注意一点就是mid的赋值方法,需要将mid赋值为(左 + 右 + 1)/ 2;这是由于存在着极端情况,当仅存在一对[1,0]时存在着最后一次判断将 left 赋值为 mid 后 ,而下一次迭代由于是向下取整的特性依然是在判断左指针,这里会存在死循环的可能。

在这里插入图片描述

而第二种情况就是模型简化为[0,0,0,0,1,1,1,1],去寻找第一个1:
这时候不需要去思考mid赋值的问题只需要直接做就可以了。

在这里插入图片描述
最后还有一种二分的特殊形态就是小数的二分:
这时候的二分更为友好,只需要注意循环条件是精度即可。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值