【问题标题】:Given a two-dimensional graph with points, find a line that passes through the largest number of points给定一个带点的二维图,找到一条通过最多点的线
【发布时间】:2018-09-18 17:18:54
【问题描述】:

这个问题来自于破解编码面试第 7 章问题 6。对于我作为数学家的我来说,这似乎是一个简单的最小二乘问题,我们可以找到最佳拟合线。虽然,在解决方案中他们采用了不同的方法。

我的问题如下:开发最小二乘法是充分的解决方案还是我不理解手头的问题?

【问题讨论】:

  • 如果您确定最小二乘法可以解决问题并且可以编码,那么它是一个有效的解决方案。这是最好的解决方案吗?仅当它比stackoverflow.com/questions/4179581/…更简单/更高效时@
  • @juvian 我的意思是最小二乘是他们在几乎任何你想使用回归的行业中所做的。我只是很困惑为什么作者采取完全不同的方法。对我来说似乎不实用。
  • 最小二乘法解决了另一个问题,结果线可能根本不通过点。
  • @MBo 我明白了,所以这不是一个真正可行的解决方案吗?
  • 是的,它不是合适的仪器

标签: algorithm computational-geometry least-squares


【解决方案1】:

最小二乘不是合适的解决方案,它不关心对齐点的数量。最小二乘拟合可能根本不包含任何点。

朱利安链接中的解决方案具有 O(N²) 行为,假设哈希映射具有 O(N) 行为来计算重复项。 (通过排序,可以保证O(N²Log N)。)

主要思想是依次取每个点,计算到所有其他点的方向,并计算重合方向。

【讨论】:

    【解决方案2】:

    您可以考虑使用双平面。
    对于坐标为 p_x,p_y 的任意点 p,可以将其转化为对偶线 p* = (y=p_xx-p_y)。
    对于任意线 l: y=mx+b,可以将其转换为它的对偶点 l
    = (m, -b)

    平面中的共线点然后在对偶平面中形成相交线。然后可以使用线相交算法来找到具有最大线数的相交点。将双平面中的这个交点转换回原始平面中的一条线可以使这条线与最大数量的点相交。

    有关详细信息,请参阅 M. de Berg 等人的 Computation Geometry 的第 8.2 章。

    【讨论】:

      【解决方案3】:

      霍夫变换主要是您要寻找的。您可以使用它的概率版本来加快速度,但会牺牲一些准确性。 OpenCv 库已经实现了,但重新实现它并不难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多