【问题标题】:Effiecient algorithm for matching line segments without intersection匹配无交叉线段的高效算法
【发布时间】:2015-04-27 09:16:39
【问题描述】:

我想知道一种有效的算法来匹配(划分为 n/2 个不同的对)n=2k 点在平面中的一般位置,这样连接匹配点的线段不会交叉。任何想法都会大有帮助。

【问题讨论】:

  • 问了 11 个问题但没有投票?

标签: algorithm geometry computational-geometry


【解决方案1】:

先生。 SRKV 有一种更简单的方法。

  1. 根据 x 坐标对所有点进行排序。
  2. 现在将最左边的点与下一个最左边的点配对。
  3. 删除我们刚刚配对的两个点。
  4. 从第 2 步继续,直到没有剩余点数。

如果两个点具有相同的 x 坐标。以下是平局规则。

  1. 将 y 坐标较低的点连接到 y 坐标第二低的点。
  2. 如果有奇数个点具有相同的 x 坐标,则我们将唯一的剩余点(最高的 y)与下一个 x 坐标(如果是多个,则最低的一个)连接。

总复杂度 O(nlogn) 排序和 O(n) 遍历所以渐近它是 O(nlogn)。

【讨论】:

    【解决方案2】:
    1. 找到凸包。
    2. 绕船体工作(假设顺时针方向),获取相邻的顶点对并将它们添加到您的对集合中。当你这样做时,从图中删除每一对。如果 hull 包含偶数个点,则全部删除,否则剩下 1 个。
    3. 如果图表仍然包含点,请转到 1。

    如果每个外壳包含偶数个点,那么很明显,该算法找到的每一对线段要么来自同一个外壳,要么来自不同的外壳——无论哪种方式,它们都不会相交。我相信即使某些船体的点数是奇数,它也会起作用。

    【讨论】:

    • 感谢您的想法。我有一个问题要在这里添加。如上所述,但是如果我们有 k 点是红色的,如果其他 k 点是蓝色的。我们可以使用火腿三明治定理来匹配红色到蓝色,这样连接匹配点的线段就不会交叉.什么是可以使用的有效算法,它的复杂性是多少? (K 是 2 的幂)
    • 我还没有听说过这个定理,但是维基百科页面说 Lo 和 Steiger 有一个 O(n) 算法可以找到一条将平面分成两部分的线,每部分都有一半红点和蓝点的一半。因此,如果 K 是 2 的幂,这必然会产生 k 个基本情况平面区域,每个区域包含 1 个红色点和 1 个蓝色点。由于这些区域是不相交的,并且每条线段都包含在一个区域中,因此没有一条线段可以相交。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多