Sonetto的二分讲解

doze_miku 发布于 2024-12-05 58 次阅读


AI 摘要

在数据结构和算法的世界里,二分查找是一门技艺,一把钥匙,打开高效搜索的宝藏。本文将深入探讨整数与实数的二分查找方法,揭示其背后的核心原理与结构。你是否曾为寻找目标值证明独特的算法而苦恼?本文不仅提供了一些易于理解的实现方式,还为你展示了如何巧妙地处理边界问题,确保你的解法既精准又高效。让我们一起踏入这一逻辑的迷宫,寻找属于你的那一份解答吧!

整数二分

  1. 确定一个区间,使目标值一定在区间内
  2. 找到一个性质,使其满足:
    1)性质具有二段性
    2)答案是二段性的分界点

一、 ans 是红色区间的右端点
将[l, r]分成[l, m - 1], [m, r]
如果m是红色的 则 ans 仍在 [m, r]中,
否则 ans 在[l, m-1]中。

while(l < r){
m = (l + r + 1) / 2;
if(m <= ans)
l = m;
else
r = m - 1;
}

二、 ans 是绿色区间的左端点
将[l, r]分成[l, m ], [m+1, r]
如果m是绿色的 则 ans 仍在 [l, m]中,
否则 ans 在[m + 1, r]中.

while(l < r){
m = (l + r) / 2; if(m >= ans)
r = m;
else
l = m + 1;
}

实数二分

和整数二分的差别只是不需要考虑边界问题
条件改为while(r - 1 > 1e-x)
x为一个符合题意的数,最好比题目给的精度大二左右

另一种更容易理解的整数二分
在这个方法中l和r永远不可能相等
a[l] 始终 < x a[r] 始终 >= x
所以找答案只需要判断a[r]是否等于目标值

while(l + 1 != r){
int mid = (l + r) >> 1;
if(check()) l = mid;
else r = mid;
}
if(a[r] == x) cout << r << ' ';
else cout << -1 << ' ';

此作者没有提供个人介绍
最后更新于 2024-12-05