快速船体的最坏情况是什么?我们怎么知道这是最糟糕的情况 我对快速船体算法感到困惑。实际上,我明白,运行行列式来找到三角形的区域,如果区域是正的,则该点位于极值点的左侧。 并且递归地执行此操作,将具有构造船体的O(n)效率。 然后我不明白,有时提到如何提高效率O(nlogn)和(n ^ 2)?在哪些情况下,这种效率结果如何? 如果有人可以通过一些特定的例子帮助,请这将是很大的帮助。
答案 0 :(得分:27)
我担心接受的答案不正确。
实际上,上面的情况是 O(n log n)的情况。只需看一下递归树。在每个步骤中,您可以在两个大致相同大的子集中剪切点集。因此,递归树的高度为 O(log n),从而导致 O(n log n)的整体运行时间。
更准确地说:快速线性算法的递归关系是 T(n)= T(a * n)+ T(b * n)+ c * n 。最后一个术语( c * n )表示搜索pivot元素。在上面构造的情况下,常数 a 和 b 是 a = b = 1/2 。您可以使用主定理来确定 O(n log n)的界限。
最坏情况 O(n 2 )是 a *n≈n-1 和 b *n≈1< / i>的。您可以使用以下规则(在极坐标中)将点放在圆的边界上来构造它: P i =(r,π/ 2 i )的。使用这组点,枢轴元素将始终是最左侧的点,因此该集合被划分为包含n-1个点和空子集的子集。因此,在递归的每个步骤中,您只“消除”一个点(枢轴元素)。因此,递归树的高度是 O(n),导致 O(n 2 )的整体效率。
答案 1 :(得分:1)
这是John's answer的动画演示,演示了在每个步骤中如何仅将一个点从考虑中删除:
答案 2 :(得分:-2)
QuickHull是一种快速算法,因为在其中一个步骤中,您消除了一堆位于三角形内的点。 QuickHull的步骤是:
当您的点被随机放置在飞机上时会出现这种情况,但是在某些情况下,这些点分布不均匀并且您无法在任何给定步骤中消除任何点。其中一种情况是当点位于圈:
的边界时
正如您所看到的,当发生这种情况时,在上述算法的第4步中,您根本不会消除任何点。这就是为什么在最坏的情况下QuickHull是O(n^2)
。