Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 给定N个点,如何找到圆上的最大点数?_Algorithm_Math_Graph - Fatal编程技术网

Algorithm 给定N个点,如何找到圆上的最大点数?

Algorithm 给定N个点,如何找到圆上的最大点数?,algorithm,math,graph,Algorithm,Math,Graph,昨天,我想到了一个有趣的问题,给定N个点,如何找到圆上的最大点数? 除了暴力,你还有什么建议吗?什么是O(?)除了退化情况,平面上的任意三点都在一个圆上。所以一个明显的O(n4)算法是枚举所有不在一条线上的三个点集(O(n3)),计算穿过三个点的圆心(可能有两个,我不确定),然后迭代其他点,检查哪些点在同一个圆上,计数,算法完成后,报告最大值。似乎存在O(N^3*logn)算法:) 实际上,给定两个点和半径,两个圆通常是可能的,但考虑到这一点(将每个组拆分为to)不会改变算法的复杂性。我也这样解

昨天,我想到了一个有趣的问题,
给定N个点,如何找到圆上的最大点数?


除了暴力,你还有什么建议吗?什么是O(?)

除了退化情况,平面上的任意三点都在一个圆上。所以一个明显的O(n4)算法是枚举所有不在一条线上的三个点集(O(n3)),计算穿过三个点的圆心(可能有两个,我不确定),然后迭代其他点,检查哪些点在同一个圆上,计数,算法完成后,报告最大值。

似乎存在O(N^3*logn)算法:)


实际上,给定两个点和半径,两个圆通常是可能的,但考虑到这一点(将每个组拆分为to)不会改变算法的复杂性。

我也这样解决它,但我认为它只不过是蛮力是的,它是蛮力,但我想知道是否真的有任何渐进更快的算法可用。最后一个O(n)(在同一个圆上搜索更多点)在实践中可以通过使用某种空间索引来改进,这样您就可以更有效地找到建议圆周附近的点,但在最坏的情况下仍然是O(n).考虑:由一个三元组生成的与其他点重叠的任何圆都将由另一个三元组再次生成,因为您正在迭代所有三元组。您可以简单地计算一个特定圆被击中的次数,使之成为一个O(n^3)算法。@b战神:没错,但别忘了“缩小”计数。如果圆被击中n次,那么对于一些k,我们必须有n=(k选择3),因为k点中的任何3点都会产生相同的圆。k是我们想要的最终答案,而不是n。@B战神:不,计算机应该做重复的事情。+1。此外,排序可以很好地处理数字精度问题,因为您可以设置一个公差,然后通过在排序列表中单步执行2个索引变量(标识当前最小和当前最大的圆),在线性时间内找到该公差内的最大半径数。而不是半径,您可以通过圆心距PQ线的距离表示穿过点P和Q的圆,一边为正值,另一边为负值(所有可能的圆心位于与PQ正交的线上,并在P和Q之间的一半处相交)。这将唯一地将所有这些圆的集合映射为实数。你能详细说明第二行吗?有无限多的圆圈穿过这两点,还是我误解了你?
iterate through all pairs of points - O(N^2)
    for each point of the rest compute radius of circle including that point and the selected pair of points - O(N)
    sort points by this radius - O(N*log N)
    select from the resulting array the biggest group with same radius - O(N)