你在二维平面上给了N个点,我需要找出包含至少M个点的圆的最小半径。
我正在使用的方法:-
我将在圆的半径上做二元搜索。
从给定集合中选取任意点p。我们用半径R旋转一个圆C,用P作为“旋转轴”(按惯例,在逆时针方向),即在旋转过程中,我们保持C接触任何时间。当c被旋转时,我们保持一个计数器来计算c包围的点的数量。
注意,这个计数器只在某个点Q进入(或离开)圆C的区域时才改变。我们的目标是提出一个算法,当另一个点Q≠P进入(或离开)C的区域时,该计数器将递增(或递减)。
(旋转)圆c的状态可以用一个参数θθ来描述,其中(r,θ)是圆c中心的极坐标,如果我们选取p作为极坐标系的不动点。对于这个系统,旋转C意味着增加θ。
对于每个点Q(≠P),我们实际上可以计算出C覆盖Q的θ的范围。更正式地说,当(iff)θ∈[α,β]时,C包围Q。
因此,到目前为止,最初的问题已经简化为:
θ的最佳值是多少,它存在于[α,β]区间的最大数目中?
减少的问题可以用一个很好的标准O(NLogn)算法来求解。〔3〕这个减少的问题必须求解N次(每个点P一个),因此时间复杂度O(n2Logn)。
我能够了解如何执行此步骤:
对于每个点q(≠p),我们实际上可以计算出c覆盖q的θ的范围。更正式地说,当(iff)θ∈[α,β]时,c包围q。
因此,到目前为止,最初的问题已经简化为:
θ的最佳值是多少,它存在于[α,β]区间的最大数目中?
你能建议一下如何实施这一部分吗?
最佳答案
当q进入或离开圆c(半径r)时:
p和c的中心之间的距离是r(因为它总是);并且
Q与C中心的距离也是R
所以,如果你在q周围画一个半径r的圆,在p周围画一个半径r的圆,当q进入或离开时,它们相交的两点是c的中心。
设±θ为c中心与pq线的夹角。如果你把它画出来,你很容易就能看到| PQ |/2R=cos(θ),这使得你很容易找到你要找的角度。
关于algorithm - 径向扫描的实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41756082/