猜猜游戏加权最佳猜测

时间:2017-01-21 04:32:57

标签: algorithm computer-science

我在实习的采访中遇到了以下问题,我仍然想知道最佳解决方案是什么。

问题:

假设你正在玩猜谜游戏。你可以猜出一个介于1和n之间的数字,你有一个api告诉你你是高还是低。

现在假设每个猜测都是加权的(即你猜20,所以成本是20)

创建算法以找到最小化成本的最佳猜测。

我在想什么:

在问题的正常版本(没有权重)中,解决方案是简单的二元搜索。

然而,在这种情况下,我认为我需要对所有可能的猜测序列进行平均案例分析,这会破坏解决方案的复杂性。例如,我开始猜测20,所以如果数字是20,我就包括成本,然后通过在较小的空间上执行类似的操作来找到下一个最佳猜测(假设我不能再猜测20)。我为所有的第一次猜测执行此操作,然后采取最低限度。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我认为这是一个动态编程问题,你最终会计算出所有区间[i,j]的最佳成本成本,其中1< = i< = j< = 20。

对于i = j,猜测{i}的成本是i。

为了找到猜测区间[i,j]的最佳成本,考虑所有可能的猜测k,其中i <= k <= j。使用猜测k的总成本是[i,k-1] + q * [k + 1,j]的最佳成本的k + p *最佳成本。 (当i> j时,[i,j]得0分)。假设您要求平均成本,则p将为(k-i)/(j + 1-i),q将为(j-k)/(j + 1-i),这些应该是目标的概率在[i,k - 1]和[k + 1,j]中。

您可以从尺寸为1的所有间隔开始获得最佳成本。从这些开始,您可以计算所有2号间隔的最佳成本,并且您可以从那里继续计算所有20个间隔的最佳成本。然后,您通常会回溯以找出每个阶段的所有最佳决策,可能使用您在计算成本时存储的信息。但在你的情况下,你只需要知道最好的第一个猜测,所以你可以在计算时存储它。

对于N = 20,你需要O(N ^ 2)个最佳成本,每个成本不超过O(N),所以我们有一个O(N ^ 3)算法。不是很好,但没有像指数一样,N = 20完全可以承受。

答案 1 :(得分:2)

编辑:我写到最后一部分,但后来意识到我无法证明这一点,所以我把它作为一个社区维基,以便有正确知识的人可以解决它。 < / p>

这是我的解决方案;忍受我,会有一些数学。我假设您希望最小化预期成本,即算法将为答案n的每个可能值(0

首先,你的答案是什么?它是大于还是小于N / 2?

(你:&#34;较小&#34;)

你说小吗?这似乎是合理的,因为选择一个更大的数字开始有更大的成本。但是,如果你猜的更小,你更有可能被告知答案高于你猜测的答案。然后你会产生更多的成本,因为更高的区域花费更多来猜测。

在未加权的问题中,如果你选择小于N / 2的东西,你就会更有可能被告知答案更高,你也会承担更多的费用。不好。

(你:&#34;那么它应该更大?&#34;)

如果它不小,那就必须如此。 (除非我问一个技巧问题而答案实际上是N / 2.但我没有。)但是有多大?再考虑未加权的问题。我们在中间选择了数字,即N / 2。我们可以选择中间的东西吗?最明显的一个是数字K,使得1 + 2 + 3 + 4 + ... + K =(K + 1)+(K + 2)+(K + 3)+(K + 4)+。 .. + N。 (这是K = N / sqrt(2)。)事实证明这是正确答案。

(你:&#34;为什么?你怎么能指望我这样相信你?&#34;)

这就是原因:

让我们先考虑未加权的问题。为什么我们先选择N / 2?当然,你并不只是相信我的waffly论点吗?如果我们选择K&lt;而不是N / 2?

(你:&#34; K小于(N - K),所以它不会是最佳的。&#34;)

那么,为什么它会以这种方式获得最佳效果呢?如果我不知道二进制搜索首先起作用,那么这不是一个争论。 (或者,如果我不同意那些教我二进制搜索的人。)请考虑以下事项:

设A(x)是从包含x个元素的范围中猜测数字所需的平均成本,并且让S(x)为总成本,即S(x)= xA(x)。

假设我们选择了中间元素N / 2。总成本S(N)= S(N / 2)+ S(N - N / 2)+ N = 2S(N / 2)+ N. (术语N是选择中间的总成本element - 答案的每个可能值的成本为1)

如果我们选择较少的东西,K&lt; N / 2?总成本S(N)= S(K)+ S(N-K)+ N.

为了表明选择中间元素并不比选择更少的元素更糟糕,我们需要证明2S(N / 2)+N≤S(K)+ S(N - K)+ N,即2S(N) / 2)≤S(K)+ S(N-K)。

考虑函数A(x)。这是一个增加的功能,因为当有更大的范围可供选择时,不可能花更少的钱。 (我可以争辩说,如果我可以花费更少的范围而不是当前的范围,我会简单地将当前的范围扩展到更大范围的大小。)*(注意:我没有声称该函数是严格增加,因为在我的证明中没有必要。)*

这意味着S(x)是identity function与函数递增的乘法,是convex function(此陈述的证明留给读者练习。)

因此,2S(N / 2)≤S(K)+ S(N-K)是Jensen's inequality的结果。 (Jensen不等式的特殊情况如下:对于任何凸函数f,2f(x)≤f(x + k)+ f(x - k)。)

如果您选择K&gt; N / 2,论证是相似的。

现在让我们继续你的问题。如果加权会怎么样?我们可以遵循类似的策略。

我们将重新定义S和A以采用两个参数,即范围的开始和结束(分别),因为相同大小的两个不同范围可能具有不同的平均成本和总成本。

如果我们选择我声称最好的元素N / sqrt(2),则总成本为S(1,N)= S(1,N / sqrt(2))+ S(N / sqrt( 2)+ 1,N)+ N * N / sqrt(2)。

选择K&lt; N / SQRT(2)?总成本为S(1,N)= S(1,K)+ S(K + 1,N)+ N * K.

我们需要证明S(1,N / sqrt(2))+ S(N / sqrt(2)+ 1,N)+ N * N / sqrt(2)≤S(1,K) + S(K + 1,N)+ N * K。

A(x,y)是凸函数,因为B(x,y)= A(x,y)/ avg(x,y)是增加函数,其中avg是某种平均函数。

对此的证明可能需要2D凸函数,其中f(x,y + p) - f(x,y)&lt; = f(x + q,y + p) - f(x + q,y )。