使用橡皮筋解决凸壳?

时间:2015-02-23 09:53:22

标签: algorithm computational-geometry

可以通过拉伸橡皮筋使其包含所有点然后释放它来找到凸包。

所以我的问题是:假设我们有一个机器人(理论机器人)来解决这个问题。 我们给它们点的坐标(我们有n个点)。

  1. 它使用一些引脚来指示电路板中的点(O(n))。

  2. 现在我们选择一个点(我们选择哪一个并不重要)然后我们检查它与其他点的距离,如(sqr(x ^ 2 + y ^ 2))。我们找到了最大距离。

  3. 然后机器人使用橡皮筋并以圆形的形式将其延伸,我们在步骤2中找到了一个距离半径,并以我们在步骤2中选择的点为中心。它释放了乐队。

  4. 然后机器人需要跟随橡皮筋在O(m)中找到凸包的顶点,其中m是凸包由它们组成的顶点。(m <= n)

  5. 因此algorithem(这种方式)的总数顺序为O(n)。

    我知道我没有考虑橡皮筋需要拉伸的时间或收缩所需的时间。

    但假设我们有很多分数(收缩/拉伸)比O(n)少得多。

    无论如何都要模拟计算机中橡皮筋的效果?

    我知道由于分选较低的波段,凸包的最低可能顺序被称为O(nlg(n))。

3 个答案:

答案 0 :(得分:2)

“无论如何都要模拟计算机中橡皮筋的效果”:不,不是计算复杂性。计算机操作一次处理一定数量的操作数。例如,典型的凸包算法将点三乘三,并检查它们是形成顺时针还是逆时针三角形。据说这是在不断的时间内完成的。

释放波段涉及所有N个点,不能实现为原始操作。

如果您尝试以某种方式使用计算机模拟它,您可以确定它至少需要执行O(N Log(N))操作。无论如何,在离散的宇宙中(整数坐标),使用基数排序可以实现O(N)。

答案 1 :(得分:2)

我猜你可以使用某种优化算法来模拟“橡皮筋算法”,但它可能会非常慢。请记住,从某种意义上说,物理世界是一个巨大的,非常复杂的计算机,一直在寻找复杂的东西,如重力,磁力等,最后但不是碰撞检测。

首先,让我们进行设置:

  • 橡皮筋表示为保持橡皮筋中每个“原子”位置的双重连接节点列表(将橡皮筋视为1-d原子链)
  • 引脚由某种空间映射表示,或非常细粒度的n维数组,包含某个小区域是否包含引脚的信息

现在,实际算法:

  • 每当橡皮筋中的“原子”接触/非常接近一个引脚(根据空间图或n-d阵列)原子是固定的并且不能再移动
  • 对于所有其他原子,稍微改变它们的位置,以便最小化到它们各自相邻邻居的距离;你可以用例如随机优化或群算法
  • 来做到这一点
  • 重复,直到所有原子都“安定下来”

当然,这种算法的复杂性非常糟糕,远比 O(n)甚至 O(nlogn)差,因为所有昂贵的计算都是“橡皮筋”通常是被称为宇宙的伟大的物理引擎。 (你可以通过在任何现代物理模拟中输入“橡皮筋和针板”问题来获得类似的结果。)

答案 2 :(得分:1)

  

但假设我们有很多分数,它比O(n)要少得多。

不,不是,因为这一步:

  

现在我们选择一个点(我们选择哪一个并不重要)然后我们检查它与其他点的距离,如(sqr(x ^ 2 + y ^ 2))。我们找到了最大距离。

您无法在O(n)以内找到此最大距离。

此外:

  

然后机器人使用橡皮筋并以圆形的形式延伸,我们在步骤2中找到了一个距离半径,并且在我们在步骤2中选择的点的中心。它释放了乐队。

     

然后机器人需要跟随橡皮筋在O(m)中找到凸包的顶点,其中m是凸包由它们组成的顶点。(m <= n)

这需要O(m*n)时间,请参阅Jarvis march算法。你需要检查每个点是否实际上是凸包的一部分,你不能只是伸展松紧带一次并完成它。