C 二进制搜索-为什么每次更改间隔时都需要减1/加1?
我最近一直在试图了解二进制搜索是如何工作的 我有这个例子C 二进制搜索-为什么每次更改间隔时都需要减1/加1?,c,algorithm,C,Algorithm,我最近一直在试图了解二进制搜索是如何工作的 我有这个例子 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; }
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;
}
它不是只适用于Right=Mid和Left=Mid吗
我似乎真的不明白
我认为我们这样做是因为我们已经测试了v[Mid],所以我们可以将间隔减小1个单位。这是原因吗
谢谢。答案是,您已经将间隔定义为严格的介于之间,因此可以执行+-1,因为您已经测试了中点,因此它不再是可能的答案 但另一半是你必须这样做,因为如果你不这样做,你可能会以
Left+1=Right
,Right=(Left+Right)/2
和V[Mid]>x
而告终,然后你就无法取得进展。在同样的情况下降落…和一个无限循环
寓意是这样的。有很多方法可以对二进制搜索进行编码。但是,如果你得到的索引有点错误,有很多方法可以得到一个无限循环。我建议你举一个例子(在纸上),试着用你的算法一步一步地解决它,就像你的程序一样。有时这有助于更好地理解算法。“我认为我们这样做是因为我们已经测试了v[Mid],所以我们可以将间隔缩小1个单位。这就是原因吗?”-是的。@skrrrt谢谢。我已经这样做了,这就是我说“我认为我们这样做是因为我们已经测试了v[Mid],所以我们可以将间隔减小1个单位。”的原因,但我不能完全确定。@usr非常感谢!拿一本书,试着找第123页。观察你的决定(也许写下来)。
Right = Mid - 1;
Left = Mid + 1;