二分——不容易

    看似简单的二分,真正用起来还是有很多不容易的地方的,所以说,有说99%的程序员写的二分通常是错的。因为我们可能要在有序队列中找小于、小于等于、大于、大于等于这些情况。往往我们很容易搞晕。我的一个朋友notsure很深入的研究过各种情况,我这里借用他的二分的写法,如果你认同这种写法对你来说容易理解,可以在理解的基础上硬记住。

    按照其写法,假设非降队列是a[],查找关键字为key,无论上面四种情况中的任何一种,二分后都有这种性质:a[high]<=key<=a[low]

大框架必定是:

 

1.关键字小于key的元素的位置:

 

因为要找小于key的元素,根据性质,毫无疑问肯定是high了,然后我们来看条件a[mid]<key,假设当前位置a[mid]=key,那么将执行high=mid-1,也就是说high还得往小的地方走,要找个更加小的,所以最后是比key还小。

2.关键字小于等于key的元素的位置:

 

结果仍然是high,但是条件a[mid]<=key,等于的时候移动的是low,high不动,所以结果最后是小于等于key。

3.关键字大于key的元素的位置:

 

根据性质结果是low,但是这里要注意了,看条件a[mid]<=key,为什么呢?还是看a[mid]=key的情况,相等的时候low还是往大处走,所以最后会大于key。

4.关键字大于等于key的元素的位置:

 

条件a[mid]<key,当a[mid]=key的时候,low不动,所以最后low大于等于key。

 

总结:

    硬记大框架,小的是high,大的是low,判断条件主要看a[mid]=key的时候决定结果的high或者low是否变,变了那么最后不可能和key相等,那么是小于或者大于,没变还是有可能相等,所以是小于等于或者大于等于

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值