【问题标题】:Maximum Collinear points in a plane平面中的最大共线点
【发布时间】:2011-05-22 03:55:52
【问题描述】:

N 点作为输入给出。

假设(x1,y1), (x2,y2)... (xn,yn)

是否有非组合解决方案来找到最大共线点数?它们可以排列成有助于计算的花哨数据结构吗?

【问题讨论】:

标签: algorithm data-structures geometry


【解决方案1】:

对于每个点 i,找到到每个其他点 j 的斜率和 寻找重复项。可以通过对斜率进行排序来找到重复项 比较相邻的值。点 i 与中的点共线 每组重复。随时跟踪最大集。

对于每个 i,您有 n-1 个斜率来计算、排序和比较。 因此,使用 (n log n) 排序,算法的复杂度为 O(n^2 log n)。

【讨论】:

  • 点对可能具有相同的斜率,但平行而不是共线。您需要查看 y 轴截距和斜率。
  • 斜率相对于我当前正在调查的点。所以平行线是不可能的。
  • 嗨,kotlinski,你可以添加一些示例代码吗?我在查找重复行时遇到问题。所以我的结果乘以重复次数。
【解决方案2】:

阅读关于这个问题的讨论here

【讨论】:

    【解决方案3】:

    以下可能是解决问题的一种方法: 1) 找到所有选择 C(n,2) 对的斜率 2)将这些斜坡分成多个桶。 3)在这些桶中找到独立的线(因为它们可能包含平行线族) 4) 建立最长的线段

    更具体地说: 1) 执行 (n-1) * (n-1) 计算以找到这么多斜率。可以使用地图以坡度作为键来保存这些点。映射中的值可以使用 Set 表示。 Set 可以包含一个表示两个点的对象。像这样的东西: {斜率1:[(p1,p2),(p1,p3),(p1,p2),(p4,p5)]} {slope2: ....}

    2) 现在,在每组点中找到独立的线。我相信迭代集合中的每个点,我们可以达到这一点。例如 在访问 (p1, p2), (p1, p3), (p1, p2), (p4, p5) 时,我们可以将其划分为形成共线点的 n-Set。设置可以从: [p1, p2],当我们遇到下一个对 (p1, p3) 时,我们检查它们中的任何一个是否已经在当前运行集中。如果其中至少有一个,那么我们将新点添加到该集合中,否则创建一个新集合。在遍历这组点中的所有点之后,我们将得到以下两组,代表 2 个独立的线段: [p1,p2,p3] [p4, p5] 这些的大小现在可以用来建立我们找到的最长的线段

    在复杂性方面,它应该是 O((n-1)*(n-1) + n) ~ O(n^2)。假设在 Set 中查找对象是 O(1)

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2014-01-13
      相关资源
      最近更新 更多