使用仅大于查询来查找项目数

时间:2019-02-07 17:40:53

标签: algorithm data-structures

有人可以为这个问题建议算法吗?

有一个充满糖果的房间(n其中0

If the candies are 110
e.g. 
1. Are the candies greater than 50? 
Answer: Yes
2. Are the candies greater than 112?
Answer: No

我们可以根据需要多次询问网守。请提出一种小于o(n)的方法。

2 个答案:

答案 0 :(得分:2)

首先,您必须找到上限。为此,您可以尝试连续2的幂(或10,或任何其他基数,但为简单起见,假设2),直到找到一个大于蜡烛数量的数字。

现在有了上限,可以使用基本的binary search直到找到正确的数字。

对于您的示例110,看起来可能像这样:

  • 第一阶段:2-> x2 = 4-> x2 = 8-> x2 = 16-> x2 = 32-> x2 = 64-> x2 = 128
  • 第二阶段:128-> -64 = 64-> +32 = 96-> +16 = 112-> -8 = 104-> +4 = 108-> +2 = 110

不难发现,两个阶段都将执行 log 2 n 个步骤,总复杂度为O(logn)。

答案 1 :(得分:1)

答案是指数搜索和二进制搜索的简单组合。首先,通过将Hi乘以2来找到糖果数的上限,直到大于糖果数。请注意,当我们停止Hi时,最多是2xcandies。因此,在执行二进制搜索后,时间复杂度为O(log(2n)),与O(log n)相同。这是伪代码:

Hi = 1
while (are there more than Hi candies?==Yes)
    Hi = 2*Hi
Lo = 1,  
M = floor((Lo + Hi)/2)
while (Lo < Hi)
   if (are there more than M candies? == Yes)
       Lo = M+1
       M = floor((Hi+Lo)/2)
   else 
       Hi = M
       M = floor((Hi+Lo)/2)

return M

答案最后存储在M中。 (实际上,到最后我们有了Hi=Lo=M。因此它们中的任何一个都可以报告为糖果的数量)。

在Wiki上查找exponential search页。