N
点作为输入。
我们说(x1,y1), (x2,y2)... (xn,yn)
。
是否存在非组合解决方案以找到最大共线点数?它们可以安排在一个有助于计算的奇特数据结构中吗?
答案 0 :(得分:10)
对于每个点i,找到每个其他点j和的斜率 寻找重复。通过对斜坡进行分类可以找到重复的 比较相邻值。点i与点中的点共线 每组重复。随时跟踪最大值。
对于每个i,您有n-1个斜率来计算,排序和比较。 因此,使用(n log n)排序,算法的复杂性是 O(n ^ 2 log n)。
答案 1 :(得分:1)
在
上阅读有关此问题here的讨论答案 2 :(得分:0)
以下可能是解决问题的一种方法: 1)找到选择C(n,2)对的所有斜率 2)将这些斜坡分成多个桶。 3)在这些桶中找到独立的线(因为它们可能包含一系列平行线) 4)建立最长的线段
更具体地说: 1)执行(n-1)*(n-1)计算以找到如此多的斜率。可以使用地图以斜率作为键来保存这些点。地图中的值可以使用Set表示。 Set可以包含表示两个点的对象。像这样的东西: {slope1:[(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)