我查看了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?
我已经在示例中尝试了这个,但事实证明这是真的,但我无法从逻辑上考虑它。
使用在循环中维护的某些不变量的某种证明将会有所帮助。
感谢。
答案 0 :(得分:0)
我的理解更符合逻辑:
如果while循环必须终止,那么lo
应该等于或大于hi
。假设我们使用整数,则lo
将等于hi
,hi
将为mid
。
答案 1 :(得分:0)
在您的语言中,循环不变式为,lo是搜索空间中p(x)可以成立的最小x。为true。循环通过将搜索空间减少一半同时保持不变来取得进展。当循环退出时,搜索空间只有一个值lo(等于hi)。我们执行最后一次检查,如果p(lo)等于false,则没有找到使p(x)成立的x。否则,它是我们寻找的最少x。