您的位置:首页 > 其它

二分回顾

2015-08-08 16:20 253 查看
lower = lower_bound(a,a+n,3);
upper = upper_bound(a,a+n,3);
for(int i=lower;i<upper;i++) cout<<a[I]<<' ';
//output  -*-  3 3 3


1.STL里面有upper_bound()以及lower_bound()

 lower_bound(a,a+n,value);返回值为数组a中≥value的位置。如果都比value小,则指向a+n,注意该位置越界。

 upper_bound(a,a+n,value);返回值为数组a中>value的位置。如果都比value小,则指向a+n,注意该位置越界。

## 这两个函数返回的是数组的迭代器,因此想得到index,需要减去数组原始坐标。

区别在于如果数组为

pos: 0  1  2  3  4  5  6  7

val:  1  2  3  3  3  6  7  8   ,lower查找3返回2,upper返回5,[lower,upper)构成value取值的区间

用法:

for( int i=0;i<20;i++) g[i]=i;

index = lower_bound(g,g+n,10) - g; /*此处得到3的位置*/

2.手写

经常题目里不会出现一个排序好的数组,而是一个函数,那么需要手写

为了标准化程序应该模拟lower_bound()和upper_bound()

lower_bound():

返回值为数组a中≥value的位置

while(x<y){
mid=x+(y-x)/2;
if(Judge(mid)>=value) y=mid;
else x=mid+1;
}
return x;


upper_bound():

返回值为数组a中>value的位置

while(x<y){
mid=x+(y-x)/2;
if(Judge(mid)>value) y=mid;
else x=mid+1;
}
return x;


二分的区间定为[x,y),即查找的区间。 但是返回值的候选区间是[x,y]。

因为mid取值为(x+y)/2的下界,所以mid不会等于y,[x,mid]不会与原区间[x,y]相同,不会死循环。

而[mid+1,y]与[x,y],mid+1>=x+1同样不会陷入死循环。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: