Topcoder教程中的离散二进制搜索

时间:2014-10-26 13:21:03

标签: binary-search

我查看了Topcoder binary search tutorial中提供的代码。

binary_search(lo, hi, p):
    while lo < hi:
        mid = lo + (hi-lo)/2
        if p(mid) == true:
            hi = mid
        else:
            lo = mid+1

    if p(lo) == false:
        complain                // p(x) is false for all x in S!

    return lo                   // lo is the least x for which p(x) is true

我无法推断为什么总是低点指向我们想要的东西,即lo是p(x)为真的最小x?

我已经在示例中尝试了这个,但事实证明这是真的,但我无法从逻辑上考虑它。

使用在循环中维护的某些不变量的某种证明将会有所帮助。

感谢。

2 个答案:

答案 0 :(得分:0)

我的理解更符合逻辑:

如果while循环必须终止,那么lo应该等于或大于hi。假设我们使用整数,则lo将等于hihi将为mid

答案 1 :(得分:0)

在您的语言中,循环不变式为,lo是搜索空间中p(x)可以成立的最小x。为true。循环通过将搜索空间减少一半同时保持不变来取得进展。当循环退出时,搜索空间只有一个值lo(等于hi)。我们执行最后一次检查,如果p(lo)等于false,则没有找到使p(x)成立的x。否则,它是我们寻找的最少x。