浮点数三分查找模板

总体上,浮点数二分查找框架和定点数一样,前面有三篇文章介绍定点数相关二分查找。

1、标准二分查找模板。https://blog.csdn.net/justidle/article/details/104303389。

2、标准二分查找左边界模板。https://blog.csdn.net/justidle/article/details/104304725。

3、标准二分查找右边界模板。https://blog.csdn.net/justidle/article/details/104304742。

这里就简单的介绍一下浮点数二分查找代码框架,其他方面的知识请参考上面三篇文章。

要点

总体上来说:四个变量(左边界、右边界、左中间值、右中间值) + 判断条件(右边界更新条件和左边界更新条件)+ 返回值。唯一要注意的就是这几个变量的类型要使用 double。

  • 循环条件: fabs(right-left)>eps
  • 使用三分: mid_l = left+(right - left)/3; mid_r=right-(right-left)/3;
  • 左边界更新:left = mid_l
  • 右边界更新: right = mid_r

关于精度eps

浮点数二分查找最坑的地方就在这个 eps 的定义。个人总结的 eps 定义总体原则如下:

1、eps 要足够大。否则答案精度可能不够。

2、可以参考题目要求的输出,将 eps 定义为输出精度的加两个数量级。例如题目输出是精确到小数点 4 位,那么我们可以如下定义:

const double eps = 1e-6;

代码模板

C++

//计算函数
bool calc(double ) {
    ...
}

//下面是主框架
double left = -1e6;//左边界。可以根据题目具体查找条件修改
double right = 1e6;//右边界。可以根据题目具体查找条件修改
double eps = 1e-9;//精度
//采用三分
double l_mid;//左中值
double l_ans;
double r_mid;//右中值
double r_ans;

while (fabs(right-left)>eps) {
    l_mid=left+(right-left)/3;
    l_ans = calc(l_mid);//使用l_mid计算

    r_mid=right-(right-left)/3;
    r_ans = calc(r_mid);//使用r_mid计算
    
    //缩小查找范围
    if (l_ans <= r_ans) {
        right = r_mid;
    } else {
        left = l_mid;
    }
}

//l_ans就是最终的结果

你可能感兴趣的:(OI,#,查找,三分,浮点数三分,三分查找)