猜测x + y值的最佳方法是什么?

时间:2014-02-20 00:43:31

标签: algorithm time-complexity binary-search

当我们只想猜一个数字时,问题很简单。例如,我们想猜x,我们知道最高可能值是n。我们可以进行二进制搜索,其复杂度为O(log n)。

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

给定0< x< n&0< y< m,如何找到查询次数最少的x + y?

假设猜测是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的值是多少。回答者可以进行三个查询,如上所示。我的问题是,回答者如何以最少的查询数找到答案。

1 个答案:

答案 0 :(得分:3)

当每种可能性具有相同的概率时,二进制搜索是最佳的。这是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都是从它们的范围内均匀地挑选出来的。如果这不是一个安全的假设,那么是的,二进制搜索平均速度最快]