总体上,浮点数二分查找框架和定点数一样,前面有三篇文章介绍定点数相关二分查找。
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就是最终的结果