繁体   English   中英

给定一组点,找出三个点是否共线

[英]Given a set of points, find if any of the three points are collinear

找出一组点中说n的三个点是否共线的最佳算法是什么? 如果不是很简单,也请解释一下复杂性。

谢谢
巴拉

如果您能提出优于O(N ^ 2)的算法,则可以发布它!

这个问题是3-SUM Hard ,是否存在次二次算法(即优于O(N ^ 2))是一个开放问题。 许多常见的计算几何问题(包括您自己的问题)已证明是3SUM难题,并且这类问题正在不断增加。 像NP-Hardness一样,3SUM-Hardness的概念已被证明可用于证明某些问题的“韧性”。

有关您的问题很难解决3SUM的证明,请参见此处的优秀综合论文: http : //www.cs.mcgill.ca/~jking/papers/3sumhard.pdf

您的问题出现在上述论文的第3页上(通常称为3-POINTS-ON-LINE)。

因此,当前最知名的算法是O(N ^ 2),您已经拥有它:-)

一个简单的O(d * N ^ 2)时空算法,其中d是维数,N是点数(可能不是最优的):

  • 在这组点周围创建一个边界框(使其足够大,以便边界上没有点)
  • 对于每对点,计算通过它们的线。
  • 对于每条线,使用边界框计算其两个碰撞点。
  • 两个碰撞点定义了原始线,因此,如果有任何匹配的线,它们也将产生相同的两个碰撞点。
  • 使用哈希集确定是否有重复的碰撞点对。
  • 当且仅当存在重复项时,存在3个共线点。

另一个不使用哈希表的简单(甚至是微不足道的)解决方案,运行时间为O(n 2 log n),并使用O(n)空间:

假设S为一组点,我们将描述一种算法,该算法找出S是否包含三个共线点。

  1. 对于S每个点o
    1. 使平行于x轴的直线L通过o
    2. SL之下的每个点替换为其反射。 (例如,如果Lx轴,则x>0 (a,-x)将在反射后变为(a,x) )。) 让新的点集为S'
    3. S'中每个点p的角度是线段po与直线L直角。 让我们按点S'的角度对其排序。
    4. 遍历S'的排序点。 如果有两个连续的点与o共线-返回true。
  2. 如果在循环中找不到共线点,则返回false。

循环运行n次,每次迭代执行nlog n步骤。 不难证明,如果一条线上有三个点,就会找到它们,否则我们将一无所获。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM