【问题标题】:Complexity of the QuickHull Algorithm?QuickHull 算法的复杂性?
【发布时间】:2012-11-23 06:52:59
【问题描述】:

我知道复杂度是 O(nlog(n))。但为什么?你是怎么得出这个答案的?

任何帮助将不胜感激,我很想知道!

【问题讨论】:

标签: java c++ algorithm sorting computational-geometry


【解决方案1】:

它的平均情况复杂度被认为是O(n log(n)),而在最坏的情况下它需要O(n^2)(二次)。

考虑以下伪代码:

QuickHull (S, l, r)

     if S={ }    then return ()
else if S={l, r} then return (l, r)  // a single convex hull edge
else
    z = index of a point that is furthest (max distance) from xy.
    Let A be the set containing points strictly right of (x, z)
    Let B be the set containing points strictly right of (z, y)
    return {QuickHull (A, x, z) U (z) U QuickHull (B, z, y)}

分区由穿过两个不同极值点的线确定:最右边的最低点r 和最左边的最高点l。找到极端需要O(n) 时间。

对于递归函数,需要n步骤来确定极值点z,但递归调用的成本取决于集合A和集合B的大小。

最佳情况。考虑每个分区几乎平衡的最佳情况。然后我们有

T(n) = 2 T(n/2) + O(n).

这是一个熟悉的递归关系,其解为

T(n) = O(n log(n)).

这将发生在随机分布的点上。

最坏情况。当每个分区极度不平衡时,就会出现最坏情况。在这种情况下,递归关系是

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

重复展开显示这是O(n^2)。因此,在最坏的情况下,QuickHull 是二次方的。


http://www.personal.kent.edu/~rmuhamma/Compgeometry/MyCG/ConvexHull/quickHull.htm

【讨论】:

  • 非常感谢您提供如此详细的回答!还有一个快速的问题……在伪代码中,它是否显示了一种分而治之的技术?这是最后一行吗?
  • @user1846486 是的,这是最后一行。这种风格和 Quicksort 算法一模一样,所以叫 Quickhull :-)
  • 好的,谢谢!最后,你知道如何求解递推方程吗?你只是将 T(n) 的值代入 T(n) 吗?我在某处读到过,但你肯定会让 2T 成倍增长吗?
  • @user1846486 通常我使用主定理,或者只是猜测和检查。主定理解决了大部分问题。
  • 非常感谢。如果你是我的老师,我会喜欢的!祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2016-07-11
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多