【问题标题】:Algorithms - 1 Egg 100 floors算法 - 1 个鸡蛋 100 层
【发布时间】:2018-02-23 01:07:51
【问题描述】:

我目前正在我的 Robert Sedgewick 和 Kevin Wayne 的著作 Algorithhms 4th Edition 中做一个谜题,这个谜题是关于经典的 Egg Dropping 问题。

这本书的内容不多,我很难理解这里的逻辑是如何工作的。但是,书中的三个问题有点像这样:

假设我们有一个有 N 层的故事建筑,并假设如果您从 F(F ≤ N) 或更高楼层掉下鸡蛋会破裂,但如果您从任何楼层掉下鸡蛋都不会破裂低于这个。我们知道 N 的值,现在我们要算出 F 的值。

a.) 假设我们有很多鸡蛋可以尝试。想出一个策略,通过压碎 ∼ lg N 个鸡蛋来计算 F。

b.) 仅使用∼ 2 lg F 鸡蛋来改进策略。

c.) 现在我们假设我们只有一个鸡蛋。想出一个策略,通过丢鸡蛋~F次来计算F的值。


现在我的假设 - 对于 a.) 的答案 - 如果我在哪里有 100 个楼层(因为它更容易计数)使用二分搜索?!还是我完全错了?

b.) 答案我不太明白。

并且 c.) 将是 F = F dropps,因为我们只有一个鸡蛋,它会在“Fth”层被压碎。如果我们从 0 层开始放下鸡蛋的楼层高度没有打破鸡蛋,那么我们尝试 1 层,如果鸡蛋在那里没有打破,我们尝试 2 层,依此类推on... 这将是一个线性搜索。

你们中的任何人以前都遇到过这种类型的问题吗?您对此有何看法? (这是我学习算法和数据结构的第一个学期,所以我是这 110% 的新手)。

谢谢!

【问题讨论】:

  • 我认为 b 中有一个错字:经典问题给你 2 个鸡蛋。此外,在每种情况下,您都应该尽量减少滴数。
  • youtube.com/watch?v=sLbke8FE2F4 21:33开题,35:27解题

标签: algorithm search binary egg


【解决方案1】:

这是我自己的解决方案,希望对您有意义:

a.) 是的,你是对的,使用二分搜索直接给出 O(lg N) 必然找到 F

c.) 是的,你是对的,从 1 楼尝试到 F 楼,当你在 ~F 中找到 F 时,唯一的鸡蛋会破裂


b.) 这是我肮脏想法的开始:

从 1 楼,然后 3 楼,然后 7 楼,然后 15 楼……直到它破裂。

我正在测试的是 (2^i) 的总和,其中 i >= 0

x 成为鸡蛋破裂之前的地板Summation(2^x)。然后我们有

求和(2^x)

现在我们可以看到找到 x 是使用 lg(Sum(2^x)) = O(lg F)

那么我们就可以在 [Sum(2^x), Sum(2^(x+1))],

范围内使用二分查找

这将使用 O(lg (Sum(2^(x+1)) - Sum(2^x))) = O(lg (2^(x+1))) = O(lg (总和(2^x) + 1)) = O(lg F)

我们应该一起得到 2O(lg F)


PS:

我认为当 F*F > N 时 2O(lg F) 可能比 O(lg N) 差。所以如果问题陈述说这是一个“改进的策略”,那就很令人困惑了

PS2:

我很笨。实际上,您可以使用相同的方法,但测试 1,2,4,8...2^x floor 并且相同的含义将成立,这给出了 2O(lg F) .我不知道为什么我的第一个想法是使用求和,这使事情变得复杂:(

【讨论】:

  • 感谢您的回答,我对问题 B 的发现只是为了弄清楚鸡蛋破裂的时间间隔是通过使用指数搜索,就像 1,2,4,8, 16 以此类推。所以 2^0, 2^1, 2^2, 2^3, 2^4 ... 等等... 所以蛋绒在 2^x-1 & 2^x 的区间内破裂。从那时起,一旦你弄清楚了,在那个区间内使用二进制搜索。
  • 是的,这基本上就是我要说的:)
【解决方案2】:

对于 A,你是对的,最多需要 log(N) 个鸡蛋才能确定鸡蛋会打破哪一层,因为我们可以进行二分搜索来找出地板

B 部分可以这样想,假设鸡蛋在第 x 层破裂,我们可以尝试将第 2 个鸡蛋从第 1 层以线性方式落到 x-1,现在假设我在 x '第 1 层,鸡蛋没有破,接下来我可以尝试让鸡蛋从当前楼层上方的 x-1 层落下。这样我们下次只需要搜索 x-1 层,同样搜索 x-2

x + (x-1) + (x-2) + (x-3) + .... + 1 = N

将是最坏的情况。您可以使用上面的公式轻松计算 x。

对于 C 部分,我们必须遍历每一层,因为我们无法以任何其他方式找到它。我们只有 1 个鸡蛋,我们必须准确地找出地板

【讨论】:

  • at most log(N) eggs ld(N) (它是 O(log(N)) 的一个元素(甚至是 Θ(log(N))))。您认为 B 部分的增长顺序是什么?
  • 我的目标是任何时候最多采取 x+1 步,并最小化 x。如果您观察鸡蛋破裂的任何一点,则步数将保持为 x+1。只需最小化 x 即可得到答案
猜你喜欢
  • 2017-02-28
  • 2017-03-08
  • 2020-05-18
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多