[英]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是点数(可能不是最优的):
另一个不使用哈希表的简单(甚至是微不足道的)解决方案,运行时间为O(n 2 log n),并使用O(n)空间:
假设S
为一组点,我们将描述一种算法,该算法找出S
是否包含三个共线点。
S
每个点o
:
x
轴的直线L
通过o
。 S
中L
之下的每个点替换为其反射。 (例如,如果L
是x
轴,则x>0
(a,-x)
将在反射后变为(a,x)
)。) 让新的点集为S'
S'
中每个点p
的角度是线段po
与直线L
直角。 让我们按点S'
的角度对其排序。 S'
的排序点。 如果有两个连续的点与o
共线-返回true。 循环运行n
次,每次迭代执行nlog n
步骤。 不难证明,如果一条线上有三个点,就会找到它们,否则我们将一无所获。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.