##第三天-----二分
二分主要就是查找,相比于遍历,二分的时间复杂度更小。
写二分时候,主要注意:
1.先排序 sort(a,a+n)/sort(a+1,a+1+n)(一般都是从小到大)
2.注意mid,right,left的取值:
a.如果用mid=(left+right)/2,在运行二分查找程序时可能溢出超时
因为如果left和right相加超过int表示的最大范围时就会溢出变为负数。
所以如果想避免溢出,不能使用mid=(left+right)/2
应该使用mid=left+(right-left)/2,同时long long mid;
(在计算机中(xy)/2可以表示为xy>>1,意思就是乘以2的一次方,<<n就是除以2的n次方,由于优先级,所以x*y不用括号)
b.right=mid 而 left=mid+1,如果是浮点数(比如求方程解)就均是=mid。
bool check(int x) {
int l=1,r=n;
while(l<r) {
int mid=(r+l)/2;
if(a[mid]==x)
return 1;
else if(a[mid]>x)
r=mid;
else
l=mid+1;
}
return 0;
}//利用在数组中找x
3.关于继续查找的条件,一般是left<right
但是在浮点数查找的过程中,会考虑到精度问题,可以先宏定义一个
eps=1e-n,这个n就取决题目,一般n大一点好,条件就可以写成
left-right<eps
double find(double x) {
double l=0,r=100,mid;
while(r-l>=eps) {
mid=(r+l)/2;
if((Equation(mid))==x)
return mid;
else if(Equation(mid)>x)
r=mid;
else
l=mid;
}
return mid;
}`//用二分找Equation方程在0到100的解
今天就写这么多,二分还是简单一些,呜呜明天搜索,据说很难,溜了