如上所示的在线构造,一个接一个地获取输入点,并找到到那时为止给定点的外壳。
我可以在O(nlogn)
或O(n^2logn)
中进行Graham扫描。但是我正在寻找一种O(n^2)
解决方案。
我已经阅读了Melkman的O(n)
算法。那是正确的方法吗?
答案 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)
中的凸包。