我可以问多少问题猜一个数字?

时间:2013-01-20 21:12:10

标签: algorithm math puzzle binary-search

如果我要求一个人在他的脑海中选择1到1200之间的数字。如果我只能提出他只会回答“是”或“否”的问题,那么在我得到他在我脑海中选择的号码的答案之前,我需要问多少个问题?

我正在寻找尽可能少的问题。任何经过验证的解决方案都是可以理解的。

4 个答案:

答案 0 :(得分:5)

要确定选择1和n之间的数字,您需要至少询问log 2 n个问题。没有办法做得更好。

这个答案的直觉如下。假设你总共提出了k个问题。即使这些问题彼此依赖,您可以收到的不同可能答案的最大数量是2 k 。由于可以选择n个可能的数字,因此您需要选择k以便

  

2 k ≥n

正是在

时才会发生
  

k≥log 2 n

换句话说,您必须至少询问log 2 n个问题,以便能够获得足够的不同可能结果,以将每个可能的数字与某些可能的结果相关联。由于问题的数量必须始终为自然数,因此您可以提出的最小问题数必须至少为⌈log 2 n⌉

这纯粹是答案的下限。在这一点上,我们不能排除你可能需要更多问题才能得到答案的可能性。但是,我们了解二进制搜索算法这一事实意味着我们知道您不需要超过⌈log 2 n⌉问题来获得答案,因为这是您要问的问题数量问你是否正在进行二元搜索。这意味着二进制搜索算法必须达到最优,因为没有可能的方式来询问较少数量的问题。

希望这有帮助!

答案 1 :(得分:1)

1200的日志基数2,向上舍入为整数:即11。基本上,每个问题都将可能的范围减半,因此您只需继续进行二分搜索,直到可能的范围为1。

答案 2 :(得分:0)

询问号码中的所有位。 11个问题就足够了。 编辑:我认为,由于二进制和十进制表示之间的双重性,所以不可能做得更好 - 至少在最坏的情况下。

答案 3 :(得分:0)

这也是对手参数方法的经典例子,用于查找下界复杂性。在我们的例子中,知道号码的人是对手。所以当你提出一个新问题时,他会明智地改变他的真实答案。他如何在每一步的答案中确定?例如,数字在1-100之间。

你问:是n> = 50?他可能会说YES或NO对他来说同样好,因为间隔相等。假设他说是的。

然后你说一个介于50< = N< = 100之间的数字,假设你问:是n> = 80.然后即使他选择的数字大于80,他也应该说NO,因为50< = n< = 80是更大的间隔。现在数字可能在50到80之间

保持这种方式,他将保证最大数量的问题,即登记,因为区间大小正在减少,如二进制搜索