1 二分的特点
- 确定一个区间,使得目标值一定在区间内。
- 找到一个性质,使其满足:性质有二段性(一边满足性质,一边不满足性质)、答案是二段性的分界点。
2 二分模板
2.1 整数二分
整数二分一般有两种情况,一种是查找满足条件的数的下界位置,称为lower_bound,另一种是求满足条件的数的上界位置,称为upper_bound。2.1.1 查找满足条件的数的下界位置
int n;//元素总个数
int num[LENGTH];
int search_lower_bound(int sea_n)
{
int l=0,r=n-1;
int mid;
while(l<r)
{
mid=(l+r)/2;
if(num[mid]>=sea_n)//符合条件
r=mid;
else
l=mid+1;
}//while结束时l=r
if(num[l]==sea_n)
return l;//找到了
else
return -1;//没找到
}
2.1.2 查找满足条件的数的上界位置
int n;//元素总个数
int num[LENGTH];
int search_upper_bound(int sea_n)
{
int l=0,r=n-1;
int mid;
while(l<r)
{
mid=(L+r+1)/2;//避免死循环,所以加一,从而取上界
if(num[mid]<=sea_n)//符合条件
l=mid;
else
r=mid-1;
}//while结束时l=r
if(num[l]==sea_n)
return l;//找到了
else
return -1;//没找到
}
2.2 实数二分
double binary_search_ss(double n)
{
double l=-10000,r=10000;
double mid;
while((r-l)>1e-6)//要比要求的精度小两个数量级
{
mid=(l+r)/2;
if(猜大了)
r=mid;
else
l=mid;
}
return mid;
}