Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二进制搜索-为什么每次更改间隔时都需要减1/加1?_C_Algorithm - Fatal编程技术网

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;