【问题标题】:Maximum number of points that lie on the same straight straight line in a 2D plane二维平面中同一直线上的最大点数
【发布时间】:2017-05-05 19:25:57
【问题描述】:

我正在尝试解决一个编程面试问题,该问题需要找到位于 2D 平面中同一直线上的最大点数。我在网上查找了解决方案。他们都讨论了使用散列的 O(N^2) 解决方案,例如此链接中的解决方案:Here

我了解使用公共梯度来检查共线点的部分,因为这是一种常见的数学技术。但是,解决方案指出,必须注意垂直线和重叠点。我不确定这些点如何导致问题?我不能将垂直线的渐变存储为无穷大(一个大数)吗?

【问题讨论】:

    标签: math hashmap geometry


    【解决方案1】:

    提示:

    如果

    ,三个不同的点共线
    x_1*(y_2-y_3)+x_2*(y_3-y_1)+x_3*(y_1-y_2) = 0
    

    无需检查斜坡或其他任何东西。不过,您需要在搜索开始之前从集合中消除重复点。

    因此选择一对点,然后找到所有其他共线的点并将它们存储在线列表中。对于剩余的点做同样的事情,然后比较哪条线的点数最多。

    你第一次有n-2 测试。第二次你有n-4 测试,因为重新审视前两点是没有意义的。下次n-6 等,总共进行n/2 测试。在最坏的情况下,这会导致(n/2)*(n/2-1) 操作的复杂度为O(n^2)

    附言。曾经决定规范答案是使用斜率的人对平面几何知之甚少。人们发明了平面上的点和线的齐次坐标,正是为了表示垂直线和其他退化情况。

    【讨论】:

    • 这是使用矩阵行列式的方法吧?它适用于 n >= 2 个不同的点吗?
    • 该测试仅适用于 3 分。你不能取非方阵的行列式。就像我说的。一次选择两个点,然后一次找到所有其他共线的点。
    • 如果我理解正确,这种方法需要 O(N^3) 时间,因为有 O(N^2) 个可能的对,我们可以为每对选择 O(N) 个可能的点?这比使用斜率的 O(N^2) 解决方案更糟糕。我认为没有任何方法可以优化此解决方案,因为矩阵行列式仅适用于 3 点。
    • 不完全是。如果您使用点对 AB 测试点 C,则没有理由使用点对 AC 之后,或 BC。这最终成为O(n^2) 操作。请参阅答案编辑。
    猜你喜欢
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多