找到贯穿大多数点的直线的最有效算法是什么?

Leo*_*nid 47 algorithm geometry computational-geometry

问题:

在2维平面上给出N个点.同一条直线上的最大点数是多少?

问题有O(N 2)解决方案:遍历每个点并找到dx / dy与当前点相关的点数.将dx / dy关系存储在哈希映射中以提高效率.

有没有比O(N 2)更好的解决这个问题的方法?

jon*_*rry 39

在标准的计算模型中,这个问题可能没有明显优于O(n ^ 2)的解决方案.

找到三个共线点的问题减少了找到穿过最多点的线的问题,找到三个共线点是3SUM-hard,这意味着在小于O(n ^ 2)时间内求解它将是一个主要问题.理论结果.

查看上一个关于找到三个共线点的问题.

为了您的参考(使用已知的证明),假设我们想要回答3SUM问题,例如在列表X中找到x,y,z,使得x + y + z = 0.如果我们有一个快速的共线点问题算法,我们可以使用该算法来解决3SUM问题,如下所示.

对于X中的每个x,创建点(x,x ^ 3)(现在我们假设X的元素是不同的).接下来,检查创建的点中是否存在三个共线点.

要看到这是有效的,请注意,如果x + y + z = 0,则从x到y的线的斜率为

(y ^ 3-x ^ 3)/(y-x)= y ^ 2 + yx + x ^ 2

从x到z的直线斜率是

(z ^ 3 - x ^ 3)/(z - x)= z ^ 2 + zx + x ^ 2 =( - (x + y))^ 2 - (x + y)x + x ^ 2 = x ^ 2 + 2xy + y ^ 2 - x ^ 2 - xy + x ^ 2 = y ^ 2 + yx + x ^ 2

相反,如果从x到y的斜率等于从x到z的斜率那么

y ^ 2 + yx + x ^ 2 = z ^ 2 + zx + x ^ 2,

这意味着

(y - z)(x + y + z)= 0,

所以要么y = z或z = -x-y就足以证明减少是有效的.

如果X中有重复项,则首先检查x + 2y = 0是否为任何x和重复元素y(使用散列的线性时间或使用排序的O(n lg n)时间),然后删除重复项,然后减少到共线寻点问题.

  • 好答案.我在接受采访时被问到这个问题,给出了一个O(n ^ 2)的答案,并对此感到不好.你的回答让我从:'( - >:D (2认同)
  • 假设点为 (x, x^3) 有什么特别之处?为什么数学不能计算出(x,x^2)? (2认同)

Erw*_* J. 5

如果将问题限制为穿过原点的线,则可以将点转换为极坐标(角度、距原点的距离)并按角度对它们进行排序。所有具有相同角度的点都位于同一条线上。O(n logn)

我认为在一般情况下没有更快的解决方案。

  • 实际上,如果将问题限制为通过原点 (0,0) 的线,则可以使用哈希在 O(n) 时间内解决。 (5认同)