最快的方法来猜测一个数字,只知道它是否高于或低于之前的猜测?

时间:2015-01-02 23:02:39

标签: python

我正在尝试解决一个问题,我必须猜测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

我正在做的是从我的第一个猜测的最低数字开始,并根据响应重置低和高。

你能帮我找到更快的方法吗?

2 个答案:

答案 0 :(得分:6)

将您的起始位置更改为范围的中间位置:

num = low

应该是:

num = int((low + high) / 2)

这是最快的方式,它被称为binary search

答案 1 :(得分:2)

您正在使用最佳算法。除了(编辑以解释乔纳森的评论):你的初步猜测是尽可能糟糕的。将初始猜测设为int((低+高)/ 2)。这将使整个循环的次数减少1。

您正在做的是二元搜索。如果您尝试猜测的数字确实是随机的,那么您就无法做得更好。

想想如果你没有每次都猜中点会发生什么。如果您的猜测在一侧比另一侧的值更多,那么您尝试查找的数字更有可能位于具有更多值的一侧。因此,大多数情况下,您消除的值不到一半。所以通常你会遇到更难的问题来解决。如果每次都取中点,那么每次将值的数量减少一半。如果你取其他一些价值,那么平均剩下一半以上。

所以我建议的唯一改变就是从

开始
num = int((high+low)/2)

值得考虑使用

(high+low)//2

而不是调用int。无论您是否使用python 2或3,都会返回一个整数:(high+low)/2在两个版本的python中会有不同的行为。