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

16 algorithm math graph

昨天,一个有趣的问题浮现在脑海中, Given N points, how do you find the maximum number of points that are on a circle?

除了蛮力外,你能提出什么建议吗?什么是O(?)?

max*_*000 16

似乎有O(N ^ 3*log N)算法:)

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 而不是半径,您可以表示通过点P和Q的圆与PQ线的中心距离,一边是正值而另一边是负值(所有可能的中心都位于与PQ正交并与之交叉的线上) P和Q之间的一半).这将唯一地将所有这些圆圈的集合映射到实数. (2认同)

Ant*_*ima 8

除了退化情况,平面上的任何三个点都在圆上.所以一个明显的O(n 4)算法是枚举所有不在一条线上的三个点(O(n 3)),计算圆的中心(可能有两个,我不确定)通过这三个点,然后遍历其他点并检查哪些点在同一个圆上,计数,并在算法完成后,报告最大值.

  • 考虑:由三重组产生的与其他点重叠的任何圆将由另一个三重组再次产生,因为您正在迭代所有这些.您可以简单地计算特定圆被击中的次数,使其成为O(n ^ 3)算法. (4认同)
  • 我也是这样解决的,但我认为这不是蛮力 (2认同)
  • @bdares:没错,但不要忘记"缩减"那个数.如果圆被击中n次,那么对于某些k,我们必须具有n =(k选择3),因为k个点中的任何3个将产生相同的圆.k是我们想要的最终答案,而不是n. (2认同)
  • @bdares:不,计算机应该做重复的事情. (2认同)