如何在O(n ^ 2)时间内实现凸包的在线构造?

时间:2019-03-14 12:32:08

标签: algorithm convex-hull

如上所示的在线构造,一个接一个地获取输入点,并找到到那时为止给定点的外壳。

我可以在O(nlogn)O(n^2logn)中进行Graham扫描。但是我正在寻找一种O(n^2)解决方案。

我已经阅读了Melkman的O(n)算法。那是正确的方法吗?

2 个答案:

答案 0 :(得分:2)

这可以通过稍微修改 Graham 扫描来完成。回想一下,静态凸包的 Graham 扫描只需要 O(N lg N),因为需要在开始时按角度对点进行排序。之后的实际堆栈操作只需要 O(N)。

因此,我们维护一个按角度排序的所有点的链表。每个附加点都可以在 O(N) 时间内插入正确的位置。之后,Graham 的堆栈操作部分仍然可以在 O(N) 时间内完成。

因此,由于有 N 次插入,每次插入的工作复杂度为 O(N),因此打印所有增量凸包需要 O(N^2) 时间。

答案 1 :(得分:0)

我想到的第一个问题是,当您已经知道计算O(n^2)中的凸包的解时,为什么需要一个O(nlogn)解。无论如何,您可以使用O(n^3)解决方案轻松解决问题,但是,我不记得有任何算法可以计算O(n^2)中的凸包。

如果您使用QuickHull算法来计算凸包,那么在最坏的情况下,这将为您带来以下重复。

T(n) = T(n-1) + O(n)

解决O(n^2)的复杂性。但是,在通常情况下,您仍然会遇到O(nlogn)的复杂性。

另一种算法是Jarvis March and Gift-Wrapping,它会计算O(nh)中的凸包,其中n是输入大小(凸包中的所有点),而h是输出大小(即,包围凸包的所有边缘)。

在此Jarvis March算法中,当凸包中的所有点都在边界内时,最坏情况的复杂性也会遇到O(n^2)。因此,在最坏的情况下,您会找到一个O(n^2)解决方案。但是,在通常情况下,它将计算O(nlogn)中的凸包。