【问题标题】:How to implement online construction of Convex Hull in O(n^2) time?如何在 O(n^2) 时间内实现 Convex Hull 的在线构建?
【发布时间】:2019-08-05 08:30:41
【问题描述】:

如在线构建,一一获取输入点,并为当时给出的点找到船体。

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

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

【问题讨论】:

  • 19 年 4 月 30 日的编辑不正确;它应该保持“O(n * n log n)”,而不是“O(n log n)”

标签: algorithm convex-hull


【解决方案1】:

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

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

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

【讨论】:

  • 这是我关于 S/O 的第一个问题,但我从来没有真正回过头来解决它。很好的答案!我相信这正是我想要的。
【解决方案2】:

我想到的第一个问题是,当您已经知道计算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(n^2) 解决方案。然而,在通常情况下,它计算O(nlogn) 中的凸包。

【讨论】:

猜你喜欢
  • 2013-08-29
  • 2015-06-29
  • 2017-07-29
  • 2011-10-29
  • 2018-04-15
  • 2012-05-17
  • 2022-12-03
  • 2016-06-10
  • 1970-01-01
相关资源
最近更新 更多