【问题标题】:computing convex hull by quick hull algorithm用快速壳算法计算凸包
【发布时间】:2017-06-15 19:34:42
【问题描述】:

我正在学习计算几何,刚刚开始学习计算凸包的快速壳算法这一主题。我有一个问题,如果我想 绘制一组 2D 点(比如 10 个点),算法将具有最坏情况下的时间复杂度,我将如何做到这一点?有什么简单的方法可以找出分数是多少?

quick hull算法的伪代码可以找到here

【问题讨论】:

  • 您的研究结果如何?当然,您对算法步骤的检查已经为您提供了一些线索。你为什么不发布你正在研究的伪代码和你的初步结论?
  • 这是我正在关注的伪代码:@beaker cse.yorku.ca/~aaw/Hang/quick_hull/Algorithm.html
  • 10 分对于最坏的情况来说太低了。顺便说一句,对于固定数量的点,所有算法的复杂度完全相同 O(1)

标签: algorithm time-complexity computational-geometry convex-hull


【解决方案1】:

我猜 QuickHull 最坏的情况是当没有拒绝发生时,即当给定点形成一个凸多边形时,并且当分区最不平衡时。

因此,您可以沿圆取点,角度呈几何减小。

【讨论】:

    【解决方案2】:

    构建一组可以产生最坏情况时间复杂度行为的点取决于您在学习材料中给出的特定伪代码。

    Quickhull 最坏情况复杂度O(N2),平均情况性能O(NlogN)。您可能已经看到,Quickhull 遵循分而治之的策略。因此,实现后者(即更好的)时间复杂度取决于能否将问题划分为 2 个大小相似(理想情况下相等)的子问题。如果划分步骤不平衡,且 2 个子问题的元素个数相差很大,算法将不得不递归 N 次。换句话说,在每个递归步骤中,问题的大小都会减少一个恒定的量,而不是减少到原始问题大小的一小部分。

    现在,您提供的伪代码将具有最低和最高 X 坐标的点(即最左边和最右边的点)作为边界将空间分成两部分。理想情况下,这应该将点分成 2 个同样大的集合。但是,如果作为输入给出的特定点使该方法效率低下怎么办?然后,在每个步骤中,您可能只排除固定数量的点,例如c,而另一半仍将包括N-c 点。因此,问题将不得不向下递归 O(N) 步,最终会得到二次复杂度。

    我相信一个这样的例子是用点画一个 V 形,如下所示。

    (0, 5)
    (10, 5)
    (1, 4)
    (9, 4)
    (2, 3)
    (8, 3)
    (3, 2)
    (7, 2)
    (4, 1)
    (6, 1)
    (5, 0)
    

    【讨论】:

    • 在最坏的情况下,圆上的所有点都会落下吗? @ilim
    • @user5411115 如果您在谈论所有圆上的点,那么可以。 (只需圆的下半部分或上半部分就足够了)但是如果您指的是圆上的一组特定点,那么它们触发最坏情况的行为将​​取决于特定的点集。您也可能会观察到,我在回答中给出的 V 形示例只是半圆上点的离散版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2010-12-17
    • 1970-01-01
    • 2011-09-03
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多