再学二分
作者:
._422
,
2021-07-15 09:11:50
,
所有人可见
,
阅读 353
再学二分
//对二分求范围和二分求具体值进一步细化
//二分的基础用法是在单调序列或单调函数中查找
整数域上的二分
//判断是否用mid=l+r+1,当成立条件为l=mid时用加1,因为l=r-1情况下会死循环在(l,r)情况下
//当mid成立在区间中时移动l变为mid,说明l——mid为边界内的移动,说明区间在边界点前面,所以为后边界
//反之当mid成立时r——>mid说明区间在边界点后面,说明为前边界点
//在计算mid时用右移而不是除2,因为右移是向下取整1而除2是向0靠近,后者不适用于负数(基本没用)
//在递增序列a中查找>=x的数最小的一个
int bisearch1(int l,int r)//这是找后边界的,可以这样想成立说明mid在区间里,却移动l说明是后边界
{
while(l<r)
{
int mid=l+r+1>>1;
if(a[mid]>=x) l=mid;
else r=mid-1;
}
return l;
}
//在单调递增序列中查找<=x的数中最大的一个
int bsearch2(int l, int r)//找前边界的
{
while (l < r)
{
int mid=l+r>>1;
if(a[mid]<=x) r=mid;
else l=mid+1;
}
return l;
}
//判断边界是否存在看l是否等于给的数,具体情况,具体分析
//更新一波
//当你找一个数并求二分时要用这种,因为后边界的在找一个数时,会在最后倾向于后面一点,而前边界就不会有这样问题。
int bsearch2(int l, int r)//找前边界的
{
while (l < r)
{
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid+1;
}
return l;
}
实数域上的二分
double bsearch3(double l,double r)
{
while(l-r<1e-5)
{
double mid=l+r/2;
if(check(mid)) r=mid;
else l=mid;
}
return l;
}