二分查找的边界问题(゚Д゚≡゚д゚)!?
医学生研究这个真是累……二分查找的思想不困难,但一些边界问题常常令人思路卡顿,
其中while(l < r)ORwhile(l <= r) 以及 r = mid - 1ORr = mid选取哪个两个问题最烦我。
---------------------------------------------(゚Д゚≡゚д゚)!?-----------------------------------------------------------------
- 循环边界
while(l < r)ORwhile(l <= r)
这时应该考虑查找到最后,l == r时是否要进行判断。
如果用while(l < r),那么查找的总区间为[left,right);
如果用while(l <= r),那么查找的总区间为[left,right]; - 分区条件
r = mid - 1ORr = mid
当然l = midORl = mid + 1和它思路相仿,这边仅以右边界分区为例子。
判断mid的取用或否应当注意mid所指示的解是否可能为唯一解,例如在有重复的元素的有序序列中查找target最左边的位置,那么mid在符合条件后答案也可能在mid的左边,所以r = mid - 1向左收缩边界,就算只有一个目标值left也会由于结束条件是l == r + 1返回第一次找到的数字;
做个总结,当使用while(l <= r)时为了避免只剩一或两个数时陷入死循环,在后面用r = mid - 1和l = mid + 1避免;
3.浮点二分查找
在浮点查找时选用的循环条件是for r - l > 1e-6,代表单次查找精度不会小于1e-6。同时在条件中有精度限制,在使用l = mid或者r = mid时能够避免l,r重合导致的死循环,可以直接用;
-------------------------------------------------(゚Д゚≡゚д゚)---------------------------------------------------------------

浙公网安备 33010602011771号