给定一个带点的二维图,找到一条经过最多点的直线
Given a two-dimensional graph with points, find a line that passes through the largest number of points
这个问题来自破解编码面试第 7 章问题 6。作为一名数学家,对我来说,这似乎是一个简单的最小二乘问题,我们在其中找到最佳拟合线。虽然,在解决方案中他们采取了不同的方法。
我的问题如下:开发最小二乘法是一个充分的解决方案还是我不理解手头的问题?
最小二乘法不是合适的解决方案,它不关心对齐点的数量。最小二乘拟合可能根本不包含任何点。
julian link 中的解决方案具有 O(N²) 行为,假设哈希映射具有 O(N) 行为来计算重复项。 (通过排序,可以保证O(N²Log N)。)
主要思想是依次取每个点,计算到所有其他点的方向,并计算重合方向。
可以考虑使用双平面
对于坐标为p_x,p_y的任意点p,可以将其转化为它的对偶线p* = (y=p_xx-p_y) .
对于任意直线 l: y=mx+b,可以将其转换为它的对偶点 l = (m, -b)
平面中的共线点然后在双平面中形成相交线。然后可以使用线相交算法来找到具有最多线的交点。将双平面中的这个交点平移回原始平面中的一条线,给出与最大数量点相交的线。
有关详细信息,请参阅 M. de Berg 等人的《计算几何》第 8.2 章。
Hough 变换正是您要寻找的。您可以使用它的概率版本以牺牲一些准确性为代价来加快速度。 OpenCv 库已经实现了它,但重新实现它并不难。
这个问题来自破解编码面试第 7 章问题 6。作为一名数学家,对我来说,这似乎是一个简单的最小二乘问题,我们在其中找到最佳拟合线。虽然,在解决方案中他们采取了不同的方法。
我的问题如下:开发最小二乘法是一个充分的解决方案还是我不理解手头的问题?
最小二乘法不是合适的解决方案,它不关心对齐点的数量。最小二乘拟合可能根本不包含任何点。
julian link 中的解决方案具有 O(N²) 行为,假设哈希映射具有 O(N) 行为来计算重复项。 (通过排序,可以保证O(N²Log N)。)
主要思想是依次取每个点,计算到所有其他点的方向,并计算重合方向。
可以考虑使用双平面
对于坐标为p_x,p_y的任意点p,可以将其转化为它的对偶线p* = (y=p_xx-p_y) .
对于任意直线 l: y=mx+b,可以将其转换为它的对偶点 l = (m, -b)
平面中的共线点然后在双平面中形成相交线。然后可以使用线相交算法来找到具有最多线的交点。将双平面中的这个交点平移回原始平面中的一条线,给出与最大数量点相交的线。
有关详细信息,请参阅 M. de Berg 等人的《计算几何》第 8.2 章。
Hough 变换正是您要寻找的。您可以使用它的概率版本以牺牲一些准确性为代价来加快速度。 OpenCv 库已经实现了它,但重新实现它并不难。