在3D中找到最大数量的共线点

时间:2017-08-07 00:01:37

标签: algorithm optimization linear-algebra

我被赋予了一项任务,我必须找到一条直线,该直线通过给定集合中的大多数点(> 5000)。

我能够解决连接2个点并检查每个其他点的问题,如果它是共线的,但这是一个O(N ^ 3)算法。

我想知道是否有办法让我的程序比O(N ^ 3)更好。

1 个答案:

答案 0 :(得分:3)

您可以使用哈希在O(n^2)中执行此操作。

  • 对于每对2个点,找到由它们O(n^2)

    定义的线方程
    • 将这些等式放入哈希O(1)(平均复杂度)中,以计算每个等式的出现次数。
  • 浏览所有哈希方程式并找到计数最多的O(n ^ 2)。这是您要搜索的行。

alg的总时间复杂度:O(n^2) * O(1) + O(n^2) = O(n^2)

棘手的一点是,由于浮点精度,同一条线看起来似乎有2个不同的方程。您需要找到考虑到这一点的哈希函数。

另一种方法是:

  • 将等式放在向量O(n^2)
  • 对矢量O(n^2 log(n^2) = O(n^2 log n)
  • 进行排序
  • 然后最终找到等长方程O(n ^ 2)的最长序列。

最终复杂度为O(n^2 log n)