我正在尝试解决一个编程面试问题,该问题要求人们找到位于2D平面中同一条直线上的最大点数。我在网上查找了解决方案。所有人都讨论了使用散列的O(N ^ 2)解决方案,例如此链接上的散列:Here
我理解使用公共梯度来检查共线点的部分,因为这是一种常见的数学技术。但是,该解决方案指出必须注意垂直线和重叠点。我不确定这些点会如何导致问题?我不能将垂直线的渐变存储为无穷大(大数)吗?
答案 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。谁曾经决定使用斜率的规范答案对平面几何知之甚少。为了必须代表垂直线和其他退化情况的确切原因,人们为平面中的点和线发明了齐次坐标。