【发布时间】:2011-05-22 03:55:52
【问题描述】:
N 点作为输入给出。
假设(x1,y1), (x2,y2)... (xn,yn)。
是否有非组合解决方案来找到最大共线点数?它们可以排列成有助于计算的花哨数据结构吗?
【问题讨论】:
-
看看这个问题及其答案:stackoverflow.com/questions/4179581/…
标签: algorithm data-structures geometry
N 点作为输入给出。
假设(x1,y1), (x2,y2)... (xn,yn)。
是否有非组合解决方案来找到最大共线点数?它们可以排列成有助于计算的花哨数据结构吗?
【问题讨论】:
标签: algorithm data-structures geometry
对于每个点 i,找到到每个其他点 j 的斜率和 寻找重复项。可以通过对斜率进行排序来找到重复项 比较相邻的值。点 i 与中的点共线 每组重复。随时跟踪最大集。
对于每个 i,您有 n-1 个斜率来计算、排序和比较。 因此,使用 (n log n) 排序,算法的复杂度为 O(n^2 log n)。
【讨论】:
阅读关于这个问题的讨论here
【讨论】:
以下可能是解决问题的一种方法: 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)
【讨论】: