我正在尝试解决一个问题,我必须猜测1到2 * 10 ^ 9之间的数字,只知道它是否高于或低于我之前的猜测。
现在我有一个适用于所有情况的代码,但它超出了只有31的猜测限制。
status = ""
high = 2000000000
low = 1
num = low
print num
while 1:
status= raw_input()
if status== "OK":
break
elif status == "Higher":
low = num
elif status == "Lower":
high = num
num = int((high+low)/2)
print num
我正在做的是从我的第一个猜测的最低数字开始,并根据响应重置低和高。
你能帮我找到更快的方法吗?
答案 0 :(得分:6)
答案 1 :(得分:2)
您正在使用最佳算法。除了(编辑以解释乔纳森的评论):你的初步猜测是尽可能糟糕的。将初始猜测设为int((低+高)/ 2)。这将使整个循环的次数减少1。
您正在做的是二元搜索。如果您尝试猜测的数字确实是随机的,那么您就无法做得更好。
想想如果你没有每次都猜中点会发生什么。如果您的猜测在一侧比另一侧的值更多,那么您尝试查找的数字更有可能位于具有更多值的一侧。因此,大多数情况下,您消除的值不到一半。所以通常你会遇到更难的问题来解决。如果每次都取中点,那么每次将值的数量减少一半。如果你取其他一些价值,那么平均剩下一半以上。
所以我建议的唯一改变就是从
开始num = int((high+low)/2)
值得考虑使用
(high+low)//2
而不是调用int
。无论您是否使用python 2或3,都会返回一个整数:(high+low)/2
在两个版本的python中会有不同的行为。