我的问题是:给定一个平面中的N个点和一个数字R,列出/枚举所有点的子集,其中每个子集中的点由半径为R的圆包围。两个子集应该是不同的并且不包括每个子集其他。
效率可能不重要,但算法不应太慢。
在特殊情况下,我们能找到分数最多的K个子集吗?可以接受近似算法。
谢谢,
编辑:似乎该声明并不清楚。我的错!
所以我重申我的问题如下:给定N个点和一个固定半径为R的圆,使用圆圈扫描整个空间。一次,圆圈将覆盖一部分点。目标是列出可由这种R半径圆覆盖的所有可能的点子集。一个子集不能是其他子集的超集。
答案 0 :(得分:0)
我不确定我的意思是“未涵盖”#39;如果你放弃它,你正在寻找的是一个Cech复合体,它的复杂性很高,你没有有效的算法,如果你没有采样条件(采样应该足够稀疏,R不要太大,否则你可能有2 ^ n个子集,n个点数)。您必须枚举所有子集并检查它们的最小封闭球半径是否低于R.您可以将搜索减少到直径小于R的所有子集(例如,成对距离低于R),这在您的情况下可能就足够了。
如果没有涵盖'对于两个子集意味着一个不包含在另一个子集中,您可以有许多不同的分解。感兴趣的是alpha复合体,因为它可以在尺寸2-3中的O(nlogn)中有效地计算(我建议使用CGAL来计算它,你也可以看到它对图片的意义)。如果您的点数很高,那么您可能最终会计算出Cech复合体。
答案 1 :(得分:0)
在不失一般性的情况下,我们可以假设所考虑的封闭圈至少通过了两个点(忽略了无点或一点的琐碎情况,并假设你的动机是最大化密度,所以你不在乎是否非最大子集被省略)。在输入点上构建邻近结构(kd树,覆盖树等)。对于每个输入点p,使用该结构查找所有点q,使得d(p,q)≤2R。对于每个点q,有一个或两个圆在其边界上包含p和q。通过求解一些二次方程找到它们的中心,然后查看q的其他选择以确定子集。