二进制搜索在这种情况下不起作用?

时间:2017-05-09 05:02:05

标签: algorithm binary-search minimax

  

https://leetcode.com/problems/guess-number-higher-or-lower-ii/#/description

     

我们正在玩猜猜游戏。游戏如下:

     

我从1到n选择一个数字。你必须猜测我选择了哪个号码。

     

每当你猜错了,我会告诉你我选择的号码   是更高还是更低。

     

然而,当你猜出一个特定的数字x,你猜错了,   你支付$ x。当你猜到我选择的数字时,你赢了比赛。

     

如果特定n≥1,找出你需要多少钱(至少)来保证获胜。

我正在练习这个问题。我认为这个问题可以用二进制搜索来解决。特别是,对于最坏的情况,总是可以假设该数字位于每个分割的右半部分。

示例:说n = 5。那你有

[1,2,3,4,5]。

首先尝试= 3,然后第二次尝试= 4.这将给你一个7美元的最坏情况。但我看过这些解决方案,在我看来他们都使用动态编程。我想知道二进制搜索算法在这种情况下怎么不起作用?

3 个答案:

答案 0 :(得分:3)

使用二进制搜索,您可以找到需要花费的最小转弯数来查找数字。但在这个问题中,您需要考虑的成本不是number of turns,而是由min sum that you pay in worst case

部分定义的if you guess wrong, you pay $x

以下是二分搜索不起作用的示例:

[1,2,3,4]

在最坏的情况下使用BS

   pick(2) -> decision: target is bigger 
-> pick(3) -> decision: target is bigger [if decision is smaller thats not worst case]
-> pick(4) -> done

Total cost = 2+3 = 5

在最佳策略中:

   pick(3) -> decision: smaller [if decision is bigger thats not worst case]
-> pick(1) -> decision: bigger [if decision is smaller thats not worst case]
-> pick(2) -> done

Total cost = 3+1 = 4

因此,对于最佳策略,您需要考虑动态编程解决方案。既然你的问题是为什么二进制搜索不能作为最佳策略在这里工作,我将把我的答案留给这只展示一个例子,而不是描述DP解决方案。

答案 1 :(得分:0)

这可能会有所帮助。二进制搜索应该有效。

public int guessNumber(int n) 
{
    int low=1;
    int high=n;

    while(low <= high){
        int mid = low+((high-low)/2);
        int result = guess(mid);
        if(result==0)
        {
            return mid;
        }
        else if(result==1)
        {
            low = mid+1;
        }
        else
        {
            high=mid-1;
        }
    }

return -1; }

答案 2 :(得分:0)

您的问题不适用于二进制搜索,因为一个重要因素 - 二元搜索旨在减少您需要尝试查找特定数字的尝试次数。

二进制搜索只会最大限度地减少您查找号码所需的点击次数(不取决于您要点击的值)。它不能最小化任何其他因素。

因此,如果您想找到最低$(您正在击中的数字总和),您必须支付最好建议您使用动态编程。