我最近在准备面试时在网上遇到了以下问题
想象一下,水滴在白板上的随机分布,设计了一种通过将水滴与线条连接来创建最大封闭区域的算法。
问题含糊不清,没有更多信息。我提出了一个部分方法,但我不太确定它是否正确。
假设水滴代表图表上的点,为了找到连接水滴所包围的最大区域,我们需要:
我还可以验证并确保输入中的水滴数大于或等于3,因为我们需要至少3个点才能找到该区域。
编辑: 上述算法找到水滴分布周边的点是不正确的。
答案 0 :(得分:2)
正如您已经指出的那样,问题很模糊。具体而言,尚不清楚"最大封闭区域"被定义为。
似乎提问者有兴趣找到凸包。这个问题有一个variety of algorithms。
答案 1 :(得分:0)
如果您不需要连接所有液滴,则可以通过查找外围上的点作为凸多边形的顶点来确定正确的轨道。一旦找到包围所有液滴并且其顶点在液滴上的凸多边形,您可以通过在"顶部"之间进行整合来找到该区域。使用梯形规则的多边形,"底部"使用梯形规则的多边形,然后减去。 "顶部"和"底部"你的多边形将是液滴序列;它们将在多边形的最左边和最右边的液滴上相遇。你可以通过下一个" top"来计算序列的其余部分。 Droplet是两个选择中较高的一个。假设多边形上的点如下:
6 | c
5 | e
4 | a
3 | b
2 | d
1 |
0 L_____________
0 1 2 3 4 5 6
最左边和最右边的点分别是a
和e
。从a
开始,确定下一个" top"我们比较c
和b
,发现c
更高,因此我们知道c
属于" top"并且b
是" bottom"的一部分。然后我们只需按照这些线条找到" top"是" a-c-e"和"底部"是" 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。
<强>无论其强>
如果您的任务是通过形成连接所有液滴的封闭区域来最大化封闭区域,则问题会变得非常不同。确定这是否是您需要做的事情。