c - C 中的安全二进制搜索

标签 c algorithm

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

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);
}

我的问题是,二分查找算法的安全版本会是什么样子?

最佳答案

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

m = (l + h) / 2;

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

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

参见 Binary Search - Arithmetic了解详情。

关于c - C 中的安全二进制搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34093386/

相关文章:

c++ - 如果数字为负,为什么在递归解决方案中查找给定序列中的最大子序列的基本情况返回 0?

c - 将位数减少 1

c - 使用指向指针的指针有什么意义?

c - 有什么方法可以扰乱 Windows 中的 TCP 堆栈吗?

algorithm - 找到所有元素的最大子数组

algorithm - 与 DFA 相比,NFA 的优缺点?

algorithm - 从字典中查找所有子序列

c - 在 c 中打印/存储 n 个字节的 u_char 指针?

C : Debugging & Run - Different Output

c - C 中的 getchar() 无需按 Enter 即可完成