平面上有n个点,如何近似地找到一个圆的最小半径,以覆盖其中k个点?假设n小于10^4。
在维基百科中,对于k==n的情况有大量信息,但我没有找到关于一般情况的信息。
平面上有n个点,如何近似地找到一个圆的最小半径,以覆盖其中k个点?假设n小于10^4。
在维基百科中,对于k==n的情况有大量信息,但我没有找到关于一般情况的信息。
01110
11111
11111
11111
01110.
现在我们知道了网格上每个中心点的数量,该数量被半径为r
的圆所包含的点数下限和半径为(1+c) r
的圆所包含的点数上限所限制。
r
,您可以通过取每对点 (p1, p2)
并查看半径为 r
的两个圆中分别包含多少点来找到可以包含的最大点数。知道了这一点,您可以二分搜索最小的 r
,使得某个半径为 r
的圆包含 k
个或更多点。p1
。除了 p1
之外还有 n-1
个点。在 p1
上固定半径为r的圆,并将其旋转;每个除 p1
之外的点最多在每次旋转中进入和离开圆一次。 - tmyklebuO(iterations * n^2 log n)
和来自排序的O(n log n)
- 但无论如何似乎都太慢了。 - se0808一种想法是将所有点的平均值作为中心,然后增加半径直到覆盖k个点。在相当均匀的分布下,这可能会做得很好,但对于“聚集”数据则会失败。例如,如果点位于两个远离彼此的紧密簇中,并且k足够小以只需要其中一个,则这将失败。如果存在这种聚类的可能性,请考虑使用聚类算法来识别局部聚类,然后如果其中一个包含足够的点,则仅在该聚类上使用该算法。