【问题标题】:How many fewer questions can I ask to guess a number? [closed]我可以少问多少个问题来猜一个数字? [关闭]
【发布时间】:2013-01-21 06:49:53
【问题描述】:

如果我让一个人在他的脑海中选择一个介于 1 到 1200 之间的数字。如果我只能问他只会回答“是”或“否”的问题,我需要问多少个问题才能得出他在我脑海中选择的数字的答案?

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

【问题讨论】:

    标签: algorithm math puzzle binary-search


    【解决方案1】:

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

    这个答案的直觉如下。假设你一共问了 k 个问题。对于这些问题,您可以收到的不同可能答案的最大数量为 2k,即使它们相互依赖。由于可以选择 n 个可能的数字,因此您需要选择 k 使得

    2k ≥ n

    这正是发生在什么时候

    k ≥ log2 n

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

    这纯粹是答案的下限。在这一点上,我们不能排除您可能需要比这更多的问题才能得到答案的可能性。然而,我们知道二分搜索算法这一事实意味着我们知道你永远不需要超过 ⌈log2 n⌉ 个问题来得到答案,因为这是你要问的问题的数量询问您是否在进行二进制搜索。这意味着二分搜索算法必须是最优的,因为不可能问出更少的问题。

    希望这会有所帮助!

    【讨论】:

    • ...为了完整回答,您提出的问题形式如下:“您的号码是否 >= j/2?”
    【解决方案2】:

    以 2 为底的 1200,四舍五入为整数:即 11。基本上,每个问题都会将可能范围减半,因此您只需继续进行二分查找,直到可能范围的长度为 1。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 数字将有 11 位。因此,您可以问“最低有效位是 1 吗?”依此类推,直到你拥有 11 位。
      • @ChristianJonassen- 这表明在 11 次猜测中 可能 做到这一点,但它没有显示 不可能 做得更好,这是 OP 的问题。
      • @ChristianJonassen -对不起,我不明白那个位概念,你能详细说明一下吗?感谢您的关心。
      • 哦。嗯,它是最优的证明stackoverflow.com/questions/7578709/…中给出
      • @user1995408:如果你有 11 位,你可以表示从 0 到 2^11 -1 = 2047 的数字。既然你可以问那个人的所有事情,你可以问类似“bit x 是否相等1"。例如,让数字为 5。二进制表示为 00000000101。如果您从 LSB 转到 MSB,他会回答您 YNYNNNNNNNN(通过使用上述问题)。这样你就可以知道它是 5。二分查找在某种程度上是相同的,只是顺序相反。
      【解决方案4】:

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

      你问:n>=50?他可能会说“是”或“否”对他来说都一样好,因为间隔是相等的。假设他说是的。

      然后你说一个介于 50=80。那么即使他选择的数字大于 80,他也应该说 NO,因为 50

      保持这种方式,他将保证最大问题数,即logn,因为间隔大小像二分搜索一样减小

      【讨论】:

        猜你喜欢
        • 2012-02-04
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        相关资源
        最近更新 更多