我被赋予了一项任务,我必须找到一条直线,该直线通过给定集合中的大多数点(> 5000)。
我能够解决连接2个点并检查每个其他点的问题,如果它是共线的,但这是一个O(N ^ 3)算法。
我想知道是否有办法让我的程序
答案 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)
。