整数二分+浮点二分

Posted 行码棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了整数二分+浮点二分相关的知识,希望对你有一定的参考价值。

整数二分

版本一:
右边是check返回为正的区间,最终的结果为右边区间的最左端的值。

while(l<r)
{
	  int mid = (l+r)>>1;
	  if(check(mid)) r = mid;
	  else l = mid + 1;
}

版本二:
左边是check返回为正的区间,最终的结果为左边区间的最右端的值。

while(l<r)
{
    int mid = (l+r+1)>>1;
    if(a[mid]<=num) l = mid;
    else r = mid-1;
}

注意:
mid的值为(l+r+1)>>1 ,必须加一。
因为如果不加一,可能有一种情况,当r = l + 1时,而check(l)刚好为真,之后取中值为mid = l + r >>1,为下取整,mid还为l,之后就会有死循环。

浮点二分

版本一:

while(r-l>=1e-8)
{
    double mid = (l+r)/2;
    if(check(mid)) r = mid;
    else l = mid;
}

版本二:

让二分有限固定次数

for(int i=1;i<=100;i++)
{
    double mid = (l+r)/2;
    if(check(mid)) r = mid;
    else l = mid;
}

因为为浮点二分,不再对r或l的值更新进行加一减一的操作

以上是关于整数二分+浮点二分的主要内容,如果未能解决你的问题,请参考以下文章

整数二分+浮点二分

浮点---二分

基础算法模板之二分

HDU5046 Airport dancing links 重复覆盖+二分

Tensorflow 二分法测试

二分法查找数组元素