我知道复杂性是O(nlog(n))。但为什么?你是如何得出这个答案的?
非常感谢任何帮助,我很有兴趣知道!
答案 0 :(得分:4)
它的平均案例复杂性被认为是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