如何在O(n^2)时间内实现在线构造Convex Hull?

How to implement online construction of Convex Hull in O(n^2) time?

在线构建,一个一个地获取输入点,并为到那时为止给定的点找到外壳。

我可以在 O(n * nlogn)O(n^2 logn) 中使用 Graham 扫描来做到这一点。但我正在寻找 O(n^2) 解决方案。

我读过 Melkman 的 O(n) 算法。这是正确的方法吗?

我想到的第一个问题是,当您已经知道计算 O(nlogn) 中的凸包的解决方案时,为什么还需要 O(n^2) 解决方案。无论如何,您可以使用 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(nlogn) 中计算凸包。

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

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

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