找到一条通过最大点数的线

时间:2012-06-07 13:36:20

标签: algorithm data-structures graph graph-theory

我在CareerCup

上找到了Google面试问题
  

给定2D平面,假设其上有大约6000个点。找到一条通过最多点数的线。

许多答案都说这个问题很难,涉及某种特殊的算法。

但我的观点不同,也许我错了。

以下是我的想法:

首先,我将轴系统给予2D平面。因此,每个点都有其唯一的x和y,即{x, y}。为简单起见,我们可以将轴系统的{0, 0}作为整个平面的左下角,因此每个x和y都大于0。

然后我有一个理论:

如果多个点位于同一行,则必须处于以下3种情况之一:

  1. 他们的 x 值相同
  2. 他们的 y 值相同
  3. 他们的 x/y y/x 值相同。但x/y案例与y/x案例相同,所以我们只关注 x/y
  4. 然后我将有3个哈希表。

    1. 第一个(hashtable-x)的密钥为x,值为具有相同x的点的列表;

    2. 第二个(hashtable-y)的密钥为y,值为具有相同y的点的列表;

    3. 最后一个(hashtable-x-y)的密钥为x/y,值为具有相同x/y的点的列表;
    4. 然后我扫描整个6000点,对于每一点,我将从x得到hashtable-x,并将该点放入该槽的值(列表)中;那么我将对hashtable-yhashtable-x-y做类似的事情。

      最后,我将扫描3个哈希表中的所有列表,并找到包含所需行的点的最长列表。

      您如何看待我的算法?


      好的,这是重复的,抱歉我之前没有找到这个问题。

      What is the most efficient algorithm to find a straight line that goes through most points?

2 个答案:

答案 0 :(得分:2)

您的算法无法按照规定运行。考虑许多点落在y = 2x + 1的线上,意味着得到(1,3),(2,5),(3,7),(4,9)和(5,11)。

除非你拥有计算几何学的研究生水平课程,否则我认为你无法解决这个问题。交易是将所有点转换为双空间中的线,使用点线对偶性并找到大多数线相交的点。天真地你可以在O(n ^ 2)中通过遍历每一对线并以分析形式评估它们相交的位置来做到这一点。我也认为你可以使用平面扫描样式算法做O(n log n),但我不确定细节。

答案 1 :(得分:0)

在我的回答中,我将假设点的数量大于或等于2(零和一点是微不足道的情况)。

首先注意,任何此类线必须通过至少两个点。所以我们可以按如下方式构建解决方案:

for each pair of points p1,p2
    find equation of the line l passing through p1,p2

    for each point p3 not p1 or p2
        if p3 lies on l
            counter[l]++

return argmax(counter)