鱼C论坛

 找回密码
 立即注册
查看: 1126|回复: 3

[已解决]二分边界问题怎么确定

[复制链接]
发表于 2023-11-22 23:35:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不会,
最佳答案
2023-11-23 17:30:51
本帖最后由 柿子饼同学 于 2023-11-23 17:35 编辑

以下是两种模板 , 分别是整数域上的二分 和 实数域上的二分(可以是小数的)
Check(x) 代表 x 作为答案满不满足条件 , 是 1 就满足 , 0 就不满足 , 根据实际需要编写
整数的二分 :
// L, R 是自己设的 最小/最大值
int l = L, r = R, mid, res;

while(l <= r){
        mid = (l + r) / 2;
        // 这个方法是求最大的符合条件的值, l 在增大
        if(Check(mid)) l = mid + 1, res = mid; 
        else r = mid - 1;
        // 求出最小的符合条件的, 看 r 每次在缩小
        // if(Check(mid)) r = mid - 1, res = mid;  
        // else l = mid + 1;
        
        // 两种情况自己看着用
}
// 过后 res 就是答案
实数上二分
double l = L, r = R, mid, res;
double eps = 1e-12;  // 极小值, 如果 r - l < eps 就可以看作相等, eps的设置要根据需要, eps 越小答案精度越高

while(r - l > eps){
        mid = (l + r) / 2;
        // 求最大的符合条件的答案
        if(Check(mid)) l = mid, res = mid;
        else r = mid;
        // 求最小的符合的答案
        // if(Check(mid)) r = mid, res = mid;
        //else l = mid;
}
// res 就是最后的答案
也可以指定循环次数 , 不用 eps , 循环次数自己调 , 次数越多精度越高
int l = L, r = R, mid, res;
for(int i = 0; i < 50; i++){
        mid = (l + r) / 2;
        if(Check(mid)) r = mid, res = mid;
        else l = mid;
        // 另一种情况不用我说了吧
}
// res 是最后答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-22 23:36:33 | 显示全部楼层
二分边界问题是指在使用二分查找算法解决问题时,需要确定二分的起始边界和终止边界。通常情况下,起始边界可以是数组或列表的第一个元素的索引,而终止边界可以是数组或列表的最后一个元素的索引。

确定边界的方法主要有两种:
1. 根据问题的具体要求:根据问题的特点和限制条件,确定起始边界和终止边界。例如,如果要在一个有序数组中查找某个特定的数值,可以将起始边界设置为0,终止边界设置为数组长度减1。
2. 使用默认边界:对于一些常见的问题,可以使用默认的边界设置。例如,在查找旋转排序数组中的最小值这个问题中,起始边界可以设置为0,终止边界可以设置为数组长度减1。

在确定边界后,通过不断调整边界和计算中间位置来进行二分查找,直到找到目标值或无法再继续划分区域。需要注意的是,边界的选择要保证每次划分都能够缩小待查找的范围,否则可能会导致死循环或找不到目标值的情况发生。因此,在确定边界时要仔细考虑问题的特性和限制条件,确保边界能够正确划分搜索区域。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-23 10:51:57 | 显示全部楼层
上网搜教程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-23 17:30:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 柿子饼同学 于 2023-11-23 17:35 编辑

以下是两种模板 , 分别是整数域上的二分 和 实数域上的二分(可以是小数的)
Check(x) 代表 x 作为答案满不满足条件 , 是 1 就满足 , 0 就不满足 , 根据实际需要编写
整数的二分 :
// L, R 是自己设的 最小/最大值
int l = L, r = R, mid, res;

while(l <= r){
        mid = (l + r) / 2;
        // 这个方法是求最大的符合条件的值, l 在增大
        if(Check(mid)) l = mid + 1, res = mid; 
        else r = mid - 1;
        // 求出最小的符合条件的, 看 r 每次在缩小
        // if(Check(mid)) r = mid - 1, res = mid;  
        // else l = mid + 1;
        
        // 两种情况自己看着用
}
// 过后 res 就是答案
实数上二分
double l = L, r = R, mid, res;
double eps = 1e-12;  // 极小值, 如果 r - l < eps 就可以看作相等, eps的设置要根据需要, eps 越小答案精度越高

while(r - l > eps){
        mid = (l + r) / 2;
        // 求最大的符合条件的答案
        if(Check(mid)) l = mid, res = mid;
        else r = mid;
        // 求最小的符合的答案
        // if(Check(mid)) r = mid, res = mid;
        //else l = mid;
}
// res 就是最后的答案
也可以指定循环次数 , 不用 eps , 循环次数自己调 , 次数越多精度越高
int l = L, r = R, mid, res;
for(int i = 0; i < 50; i++){
        mid = (l + r) / 2;
        if(Check(mid)) r = mid, res = mid;
        else l = mid;
        // 另一种情况不用我说了吧
}
// res 是最后答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 23:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表