繁体   English   中英

二进制搜索 - 为什么每次更改间隔时都需要减 1/加 1?

[英]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=RightRight = (Left+Right) / 2V[Mid] > x ,然后你就失败了取得进展。 让你陷入同样的境地……和一个无限循环。

道德是这样的。 有很多方法可以编写二进制搜索。 但是,如果你得到的索引稍微有点错误,那么有很多方法可以得到一个无限循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM