[英]Binary search - why do I need to subtract 1/add 1 everytime when changing the interval?
我最近一直在尝试了解二进制搜索的工作原理。
我有这个例子。
int CautareBinara(int x)
{
int Sol = -1, Left = 0, Right = N;
while(Left <= Right)
{
int Mid = (Left+Right) / 2;
if(V[Mid] == x)
{
Sol = Mid;
break;
}
if(V[Mid] > x)
Right = Mid - 1;
if(V[Mid] < x)
Left = Mid + 1;
}
return Sol;
}
我明白了,我真的明白它是如何工作的,但是我缺少一件事。
为什么我需要在语句中减 1/加 1
Right = Mid - 1;
Left = Mid + 1;
它不是只适用于 Right = Mid 和 Left = Mid 吗?
我好像真的不明白。
我认为我们这样做是因为我们已经测试了 v[Mid],所以我们可以将间隔缩小 1 个单位。 这是原因吗?
谢谢。
答案是您已将间隔定义为严格介于之间,因此可以执行 +-1,因为您已经测试了中点,因此它不再是可能的答案。
但另一半是你必须这样做,因为如果你不这样做,你可能会得到Left+1=Right
, Right = (Left+Right) / 2
和V[Mid] > x
,然后你就失败了取得进展。 让你陷入同样的境地……和一个无限循环。
道德是这样的。 有很多方法可以编写二进制搜索。 但是,如果你得到的索引稍微有点错误,那么有很多方法可以得到一个无限循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.