我读到了计算凸包的算法。其中大部分都需要O(n*log(n))
次,其中n
是输入点的数量。
让S = {p_1, p_2, ..., p_n}
成为一组按x坐标排序的点,即p_1.x <= p_2.x <= ... <= p_n.x
。
我必须描述一种算法,该算法在S
时间内计算CH(S)
,O(n)
的凸包。另外,我还必须分析算法的运行时间。
答案 0 :(得分:4)
关键是你的点排序到x坐标。因此,您可以利用Graham scan:
排序这些点的时间复杂度为O(n log n)。虽然看起来似乎 循环的时间复杂度为O(n 2 ),因为 每一点它都会返回以检查之前的任何一点是否有效 &#34;右转&#34;,它实际上是O(n),因为每个点都被认为是 在某种意义上最多两次。 [...]整体时间复杂度是 因此O(n log n),因为排序的时间占据了的时间 实际上是计算凸包。
因此,在您的情况下,您跳过排序部分,允许您实现O(n)
时间复杂度。
事实上,该文章继续在Notes:
如果输入在x坐标上排序,同样的基本思想也适用 而不是角度,船体是在两个步骤中计算出来的 船体的上部和下部分别为[...]
答案 1 :(得分:1)