二分算法
原理
每次都将待查找区间缩小一半,通过比较目标值与区间中间元素的大小,来确定下一步在左半区间还是右半区间继续查找,直到找到目标元素或确定目标元素不存在。
整数二分
通过数据规律对比中间值和目标值的对应关系确定二分边界的更新方式,使用对应的二分算法求解问题。
int bsearch_1(int l,int r)
{while(l<r){int mid=l+r>>1;if(check(mid)) r=mid;else l=mid+1;}return l;
}
int bsearch_2(int l,int r)
{while(l<r){int mid=l+r+1>>1;if(check(mid)) l=mid;else r=mid-1;}return l;
}
向下取整,如果r=l-1,会产生l=mid死循环的边界问题,因此确定mid时补上加一。
浮点数二分
//求根
#include<iostream> using namespace std;int main()
{double x;cin>>x;double l=0,r=x;while(r-l>=1e-6){double mid=(l+r)/2;if(mid*mid>x) r=mid;else l=mid;}printf("%f\n",l);}