概述:
以前刚开始学二分的时候,只知道二分就是一半一半的分下去,对于边界问题一直都不是很懂,之前为了避免这问题想着用一个对拍程序来查看自己写的是否是对的,但是想了想还是要想一个正解。
注意点:
二分时主要是防止l和r的值都不发生改变,使得程序进入了死循环。
接下来是本人的一点理解。
本人理解:
整数二分:
找最大值:
while(l<r){
if(mid<=x) l=mid;//如果mid<=x,那么最优解一定不在左区间
else r=mid-1;//如果mid>x,那么x即其右区间都无解
//为防止mid取到l或r时死循环
mid=(l+r+1)>>1;//取不到l,防止l=mid时死循环
}
找最小值:
while(l<r){
if(mid<=x) r=mid;//如果mid>=x,那么最优解一定不在右区间
else l=mid+1;//如果mia<x,那么x即其左区间无解
//为防止mid取到l或r时死循环
mid=(l+r)>>1;//取不到r,防止r=mid时陷入死循环
}
实数二分:
不用考虑死循环的情况,主要需要考虑精度问题。
三分求单峰函数极值:
只适用于有单调性的函数,如$y=x^2$类似的二次函数,通过三分确定趋势,从而确定最终极值。