当前位置:  开发笔记 > 人工智能 > 正文

在C中安全二进制搜索

如何解决《在C中安全二进制搜索》经验,为你挑选了1个好方法。

从理论上讲,大多数二进制搜索算法的实现都被打破了,因为程序可能会遇到大型数组的分段错误.例如,以下实现就是这种情况.

int binarysearch(int x, int *v, int n) {
    int l, h, m;
    l = 0;
    h = n - 1;

    while (l <= h) {
        m = (l + h) / 2;

        if (x < v[m]) h = m - 1;
        else if (x > v[m]) l = m + 1;
        else return m;
    }

    return -1;
}

int main (void) 
{
    int n = (INT_MAX/4) * 3;
    int *v = calloc(n, sizeof(int));
    (void) binarysearch(1, v, n);
    cfree(v);
}

我的问题是,二进制搜索算法的实现的安全版本将如何?



1> dasblinkenli..:

代码中有问题的部分是它的中点计算:

m = (l + h) / 2;

int溢出时会产生错误的结果.您可以通过切换到long long计算或使用安全公式来避免这种情况:

m = (h - l)/2 + l;

有关详细信息,请参见二进制搜索 - 算术.


@SomeWittyUsername:如果`l`和`h`都是奇数,那就不起作用了.
推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有