【问题标题】:Two egg dropping puzzle variation: unknown/infinite floors两个鸡蛋掉落拼图变化:未知/无限楼层
【发布时间】:2018-04-16 07:25:48
【问题描述】:

前言

这个问题的灵感来自上周关于 SO 的一个类似问题,该问题在明确真正的问题是什么之前就被删除了。我认为这种变化是我想分享的一个很好的问题。

两个鸡蛋问题

详细的定义和解决方法可以在here找到,不过我会加个小结:

定义

您将获得两个鸡蛋,并可以使用k-层建筑物。两个鸡蛋 是相同的。目的是找出最高楼层f* 鸡蛋从那层楼的窗户掉下时不会破裂。如果 鸡蛋掉下来不破,完好无损,可以掉下来 再次。然而,一旦一个鸡蛋被打破,那就是那个鸡蛋。找到f*的最快(最少滴)方法是什么?

解决方案

这个想法是从sqrt(k), 2*sqrt(k), 3*sqrt(k)... k 的地板上放下第一个鸡蛋。如果鸡蛋在i*sqrt(k) 楼层破裂,则使用第二个鸡蛋测试(i-1)*sqrt(k)i*sqrt(k)-1 之间的剩余楼层。总的来说,这将导致最多 2*sqrt(k) 下降,因此复杂度将是 O(sqrt(k))

为了完整起见:有一种方法在最坏的情况下掉线更少(详情可以在here找到),但它的复杂度与O(sqrt(k))相同

问题:无限/未知楼层的两个鸡蛋问题

现在假设您没有关于kk 是无限的楼层数的信息。是否有可能找到f* 比仅在O(f*) 中测试每个楼层更有效?

换句话说:有没有一种有效的方法来丢弃运行时复杂度与k无关但只取决于答案f*的两个鸡蛋?

【问题讨论】:

    标签: algorithm language-agnostic time-complexity


    【解决方案1】:

    有一个简单的方法,复杂度为 O(sqrt(f*))。将你的第 n 步设置为 n 层,即检查 1、3 (1 + 2)、6 (1 + 2 + 3) 等楼层。这样在第 n 步你将在 n*(n+ 1)/2 层,您将在 n = O(sqrt(f*)) 步内到达 f*。

    那么对于第二个鸡蛋,您需要在第 1 阶段的最后一步上走 n 个步骤,这将增加另一个 O(sqrt(f*))。

    如果 O(sqrt(k)) 对于已知 k 是最优的,那么这个方法在复杂性方面也必须是最优的。

    【讨论】:

      【解决方案2】:

      两个鸡蛋的无限问题的次优解决方案是使用序列1, 2^2, 3^3,... ,i^2,... 并在第一个鸡蛋保留的最后一个值处开始第二条边。因此,如果第一个边保持在 n^2,那么下一个将最多进行 2*n + 1 - 1(从第一个减去 1)测试,以在最坏的情况下与 n = sqrt(m) 给出 3 * n 的总数。

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 2017-09-19
        • 2018-02-23
        • 2020-05-18
        • 2012-04-27
        • 2016-01-01
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        相关资源
        最近更新 更多