【问题标题】:Maximum area enclosed by water droplets水滴包围的最大面积
【发布时间】:2018-01-04 13:26:51
【问题描述】:

我最近在准备面试时在网上遇到了以下问题

想象一个随机分布在白板上的水滴,设计一种算法,通过用线条连接水滴来创建最大的封闭区域。

问题含糊不清,没有更多信息。我想出了一个部分的方法,但我不太确定它是否正确。

假设水滴代表图上的点,为了找到由连接水滴包围的最大区域,我们需要:

  1. 找到位于该集群外围的所有点。连接位于外围或边界上的所有点将得到最大的面积。
  2. 要查找位于外围的点:
    1. 对 x 和 y 坐标进行排序。连接位于极端的点。因此,我们会将具有最大 x 坐标的点与最小 x 坐标以及最大/最小 y 坐标连接起来。 (我不太确定这种方法。)
  3. 我不知道如何找到这个图形的面积,因为它的范围可以从 3 到 n 边。

我还可以验证并确保输入中的水滴数量大于或等于 3,因为我们需要至少 3 个点才能找到该区域。

编辑: 上述寻找水滴分布外围点的算法是错误的。

【问题讨论】:

  • 你在问什么?
  • @rvheddeg 2 件事。我为查找最大对象指定的算法是否正确(查找位于外围的点:)。以及应该使用什么方法来找到 n 边多边形的面积。

标签: algorithm


【解决方案1】:

正如您已经指出的,这个问题很模糊。具体来说,不清楚“最大封闭区域”是如何定义的。

提问者似乎对寻找凸包感兴趣。这个问题有一个variety of algorithms

【讨论】:

    【解决方案2】:

    如果您不需要连接所有液滴,那么通过在外围寻找点以用作凸多边形的顶点,您就走在了正确的轨道上。一旦找到一个包含所有液滴并且其顶点位于液滴上的凸多边形,您可以通过使用梯形规则在多边形的“顶部”下方积分来找到该区域,在多边形的“底部”下方使用梯形法则,然后相减。多边形的“顶部”和“底部”将是液滴序列;它们将在多边形的最左边和最右边的液滴处相遇。您可以通过将下一个“顶部”液滴作为较高的两个选择之一来计算序列的其余部分。假设多边形上的点如下:

    6 |     c
    5 |           e    
    4 | a    
    3 |   b
    2 |         d
    1 |
    0 L_____________
      0 1 2 3 4 5 6
    

    最左边和最右边的点分别是ae。从a开始,确定下一个“顶”点,我们比较cb,发现c更高,所以我们知道c是“顶”的一部分,b是一部分的“底部”。然后我们简单地按照这些线找到“top”是“a-c-e”,“bottom”是“a-b-d-e”。

    “top”下的区域可以用梯形法则求出,在每条线段下积分:

    (1,4) to (3,6)
    A = w x (h1 + h2) / 2
    A = (3 - 1) x (4 + 6) / 2 = 2 x 5 = 10
    
    (3,6) to (6,5)
    A = w x (h1 + h2) / 2
    A = (6 - 3) x (6 + 5) / 2 = 3 x 5.5 = 16.5
    
    A = 10 + 16.5 = 26.5
    

    在底部集成的工作方式相同:

    A = 3.5 + 7.5 + 3.5 = 14.5
    

    现在我们减去多边形的面积是12。

    但是

    如果你的任务是通过形成一个连接所有液滴的封闭区域来最大化封闭区域,那么问题就变得非常不同了。确定这是否是您需要做的。

    【讨论】:

      猜你喜欢
      • 2015-02-08
      • 1970-01-01
      • 2013-09-20
      • 2015-07-13
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多