如何在O(n)时间内计算按x坐标排序的一组点的凸包?

时间:2017-05-23 12:48:56

标签: algorithm time-complexity computational-geometry convex-hull

我读到了计算凸包的算法。其中大部分都需要O(n*log(n))次,其中n是输入点的数量。

S = {p_1, p_2, ..., p_n}成为一组按x坐标排序的点,即p_1.x <= p_2.x <= ... <= p_n.x

我必须描述一种算法,该算法在S时间内计算CH(S)O(n)的凸包。另外,我还必须分析算法的运行时间。

2 个答案:

答案 0 :(得分:4)

关键是你的点排序到x坐标。因此,您可以利用Graham scan

  

排序这些点的时间复杂度为O(n log n)。虽然看起来似乎   循环的时间复杂度为O(n 2 ),因为   每一点它都会返回以检查之前的任何一点是否有效   &#34;右转&#34;,它实际上是O(n),因为每个点都被认为是   在某种意义上最多两次。 [...]整体时间复杂度是   因此O(n log n),因为排序的时间占据了的时间   实际上是计算凸包。

因此,在您的情况下,您跳过排序部分,允许您实现O(n)时间复杂度。

事实上,该文章继续在Notes

  

如果输入在x坐标上排序,同样的基本思想也适用   而不是角度,船体是在两个步骤中计算出来的   船体的上部和下部分别为[...]

答案 1 :(得分:1)

我无法抗拒解释程序。

这些点按字典(x,y)顺序排序。

假设我们已经构建了K个第一点的上部船体。如果我们想获得K + 1第一点的上部船体,我们必须找到新点和上部船体之间的“桥梁”。这是通过在船体上回溯直到新点和船体边缘形成凸角来完成的。

当我们回溯时,我们丢弃形成凹角的边缘,最后我们将新点链接到自由端点。 (在图中,我们尝试三条边并丢弃其中两条。)现在我们有K + 1点的上部船体。

enter image description here

线性行为简单地通过以下事实证明:存在N个前向步骤(添加N个顶点)和N-H后向步骤(N-H边缘被丢弃,其中H是最终船体顶点的数量)。

对称程序构建了下部船体,整个凸包是通过连接获得的。