找到一个与平面中所有其他点不共线的点

时间:2012-04-08 22:19:59

标签: algorithm

给定一般位置的平面中的N个点的列表(没有三个是共线的),找到一个与N个原始点的任何一对不共线的新点p。

我们显然无法搜索平面中的每个点,我开始找到可以用给定点形成的所有线的重合点,或者用它们制作圆圈的东西......我没有任何线索如何检查所有要点。

http://introcs.cs.princeton.edu/java/42sort/

中的问题

我在一本着名的算法书中发现了这个问题,这意味着它是可以回答的,但我想不出最佳解决方案,这就是为什么我在这里发布它以便如果有人知道它可以回答它

2 个答案:

答案 0 :(得分:0)

我能想到的最好的是N ^ 2算法。这是:

  1. 选择一个容差 e 来控制你愿意接近由集合中的点组成的线的距离。
  2. 计算您的一组积分的convex hull
  3. 选择一条平行于凸包一侧的直线L,距离船体 3e
  4. 在L上选择一个P点,使P在凸包上L的投影之外。凸包在L上的投影是L的间隔.P必须放在这个区间之外。
  5. 测试集合中的每对点。对于由2个测试点形成的特定线M,在P周围与半径 2e 的盘相交,沿着L进一步向外移动P直到M不再与盘相交。通过构造L,可以没有与L平行的线与L平行,所以总是这样做。
  6. 如果M超过P超过L,则将P移动到该交叉点之外,再远远超过M不会通过光盘。
  7. 完成所有这些操作后,选择距离 e 的点,在垂直于L的位置。它可以是共线,没有任何线条。
  8. 我将在步骤5中留下如何选择P沿L的下一个位置的详细信息,

    你可以做一些明显的琐碎拒绝测试,只有测试线M与L“足够平行”才能进行更昂贵的检查。

    最后,我应该提一下,可能有可能将P推得远远超出数值问题。在这种情况下,我建议的最好的方法是尝试在凸包外面的另一条线至少 3e

答案 1 :(得分:0)

您可以使用简单的O(nlogn)算法实际解决它,然后我们将改进为O(n)。名称最底部的一个点(如果是平局,则选择具有较小x坐标的那个)。您现在可以使用CCW按顺时针顺序对其余点进行排序。现在当您从排序顺序处理每个点时,您可以看到在具有与点A和底轴不同的角度的任意两个连续点之间(让这些是U,V),没有点具有角度c,其中U <= c&lt; = V.因此我们可以添加本节中的任何一点,并保证它不会与该集合中的任何其他点共线。 所以,你所需要的只是找到一对相邻的点,你就完成了。因此,在O(n)时间内找到A(这些应该是不同的)的最小和第二个最小角度,并选择它们之间的任何点。