如何在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) 的时间来打印所有增量凸包。
在线构建,一个一个地获取输入点,并为到那时为止给定的点找到外壳。
我可以在 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) 的时间来打印所有增量凸包。