位于2D平面中相同直线上的最大点数

时间:2016-12-20 14:32:27

标签: math hashmap geometry

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

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

1 个答案:

答案 0 :(得分: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)复杂度。

PS。谁曾经决定使用斜率的规范答案对平面几何知之甚少。为了必须代表垂直线和其他退化情况的确切原因,人们为平面中的点和线发明了齐次坐标。