【问题标题】:What is the best way to guess the value of x+y? [closed]猜测 x+y 值的最佳方法是什么? [关闭]
【发布时间】:2014-02-21 01:22:52
【问题描述】:

当我们只想猜一个数字时,问题很简单。例如,我们想猜测 x,我们知道可能的最大值是 n。我们可以做二分查找,复杂度是O(log n)。

但是,我发现了这个问题的变体:

给定0

假设猜测是z,我们可以让提问者与另一个值进行比较,他会说出z和另一个值之间的关系——即小于、等于或大于。可能的比较是:
(1) 比较 x 和 z。
(2) 比较 y 和 z。
(3) 比较 x+y 和 z。

在我看来,我们可以对 (x+y) 进行二分搜索。因此,时间复杂度为 O(log(m+n))。这比先找到 x,然后再找到 y,复杂度为 O(log m + log n) = O(log mn)

但是,我很好奇是否有比在 x+y 上进行二分搜索更好的解决方案。

非常感谢您的帮助。


编辑: 所以提问者首先想到了数字 x 和数字 y,然后他问回答者 x+y 的值是多少。回答者可以进行三个查询,如上所示。我的问题是回答者如何以最少的查询找到答案。

【问题讨论】:

  • 二分查找复杂度 O(log(n))
  • Given 0<x<n and 0<y<m, how to find x+y with the smallest number of queries? 什么?您是否试图找到任何两个数字,使得它们的总和等于具有这些约束的其他数字?
  • 日志的有趣之处:log (m n) = log m + log n
  • @FiveFiftyFive:当每个可能性具有相等的概率时,二分搜索是最佳的。 xy 的情况是这样,但x+y 的情况不是。最佳将类似于但不完全是二进制搜索。仍在研究细节。 (另一方面,我想到的最佳搜索仍然是 O(log(m+n)),它平均而言会更快。
  • 可能不会。任何智能策略都不应该需要超过两个“相等”的响应,通过我前面提到的技术的相当懒惰的应用,它给出了 lg (m + n) - c lg lg (m + n) 最坏情况下限一些不太大的 c.如果这个差距不能缩小到 O(1),我会感到惊讶。

标签: algorithm time-complexity binary-search


【解决方案1】:

当每个可能性具有相等的概率时,二分搜索是最优的。 x 和 y 都是这样,但 x+y 不是这样。平均猜测最少的策略类似于但不完全是二分搜索。

使用二分搜索,所有可能性都是同等可能的

probability |                                                    |
            | [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
            | [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
            | [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
            |_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_|
              0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16

我们猜测中间,并丢弃一半可能的答案:

probability |                       V  X  X  X  X  X  X  X  X  X |
            | [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
            | [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
            | [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] |
            |_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_|
              0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16

所有剩余的答案仍然同样可能,因此我们可以简单地递归。

当找到 x+y 时,其中 x 和 y 都是从一个统一的概率范围中随机选择的,每个 x+y 的概率并不相等。

probability |                          V                      |
            |                         []                      |
            |                      [] [] []                   |
            |                   [] [] [] [] []                |
            |                [] [] [] [] [] [] []             |
            |             [] [] [] [] [] [] [] [] []          |
            |          [] [] [] [] [] [] [] [] [] [] []       |
            |       [] [] [] [] [] [] [] [] [] [] [] [] []    |
            |____[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_|
              0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 

显然,猜中间还是最好的第一个猜测:

probability |                          V  X  X  X  X  X  X  X |
            |                         []                      |
            |                      [] [] []                   |
            |                   [] [] [] [] []                |
            |                [] [] [] [] [] [] []             |
            |             [] [] [] [] [] [] [] [] []          |
            |          [] [] [] [] [] [] [] [] [] [] []       |
            |       [] [] [] [] [] [] [] [] [] [] [] [] []    |
            |____[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_[]_|
              0  1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 

但不直观的是接下来要猜测的位置。在上图中,8 之后的最佳猜测是 5 或 6(不是 4),但我不确定如何准确计算。如果我弄清楚了,我会告诉你的。

 v = lower_bound
 u = upper_bound
 t = probability(v)
 s = probability(u)
 r = min(s,t)
 p = guess

 (p-v)r+(p-v)^2/2 = (u-p)r+(u-p)^2/2
 pr-rv+(p^2-pv+v^2)/2 = ur-pr+(u^2-up+p^2)/2
 2pr-2rv+p^2-pv+v^2 = 2ur-2pr+u^2-up+p^2
 2pr-2rv+p^2-pv+v^2-2pr+up-p^2 = 2ur+u^2
 2pr+p^2-pv-2pr+up-p^2 = 2ur+u^2+2rv-v^2
 -pv+up = 2ur+u^2+2rv-v^2
 (u-v)p = u^2+2ur+2rv-v^2
 p = (u^2+2ur+2rv-v^2)/(u-v)

不,这也是错误的。仍在努力。

[Niklas B. 观察到这个答案中的所有内容都假设 x 和 y 都是从它们的范围内统一挑选的。如果这不是一个安全的假设,那么是的,平均而言,二分查找是最快的]

【讨论】:

  • 可视化非常清晰。但是,考虑到概率,我们应该使用哪种算法而不是二分搜索?
  • “如何精确计算”使用 Knuth 的二次时间动态程序计算具有给定访问频率的最优二叉搜索树?
  • @FiveFiftyFive:我在想一些类似于二分搜索的东西,除了你选择 朝向 原始范围的中间而不是 恰好 之间的最小值和最大值,但我无法准确计算一个人应该猜到什么。大卫:我不知道那是什么,但听起来很有道理。
  • 您选择一个枢轴,使剩余概率密度下的区域减半。如果你假设均匀分布,你可以使用简单的几何来计算分裂点
  • @NiklasB.:这是我的想法,但选择分裂点背后的数学运算比我预期的要棘手,而且我同时还在做其他事情。
猜你喜欢
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2010-11-16
相关资源
最近更新 更多