【问题标题】:List all sets of points that are enclosed by a circle with given radius列出由给定半径的圆所包围的所有点集
【发布时间】:2015-06-27 10:10:35
【问题描述】:

我的问题是:给定平面上的 N 个点和一个数字 R,列出/枚举所有点的子集,其中每个子集中的点都被一个半径为 R 的圆包围。两个子集应该不同,并且每个子集都不被覆盖其他。

效率可能不重要,但算法不能太慢。

在特殊情况下,我们能找到 K 个点最多的子集吗?可以接受近似算法。

谢谢,

编辑:似乎该声明不清楚理解。我的错!

所以我重申我的问题如下:给定 N 个点和一个半径为 R 的圆,使用该圆扫描整个空间。一次,圆圈将覆盖点的子集。目标是列出可以被这样的 R 半径圆覆盖的所有可能的点子集。一个子集不能是其他子集的超集。

【问题讨论】:

  • 问题出在哪里?你试过什么?有什么限制?什么语言平台?太慢(10us,2 年)是什么意思?

标签: algorithm geometry computational-geometry


【解决方案1】:

我不确定我明白你所说的“未覆盖”是什么意思。如果你放弃这个,你正在寻找的正是一个复杂性很高的 Cech 复合体,如果你没有采样条件,你将不会有有效的算法(采样应该足够稀疏并且 R 不能太大,否则你可以有 2^ n 个子集,n 个你的点数)。您必须枚举所有子集并检查它们的最小封闭球半径是否小于 R。您可以将搜索减少到直径小于 R 的所有子集(例如,成对距离小于 R),这在您的情况下可能就足够了。

如果两个子集的“未涵盖”意味着其中一个不包含在另一个子集中,则您可以进行许多不同的分解。令人感兴趣的是 alpha 复数,因为它可以在 2-3 维的 O(nlogn) 中有效地计算(我建议使用 CGAL 来计算它,您还可以通过图片查看它的含义)。如果您的点是高维的,那么您最终可能会计算 Cech 复形。

【讨论】:

    【解决方案2】:

    在不失一般性的情况下,我们可以假设所考虑的包围圈通过至少两个点(忽略没有点或一个点的琐碎情况,并假设您的动机是最大化密度,因此您不在乎是否非最大子集被省略)。在输入点上构建邻近结构(kd-tree、cover tree 等)。对于每个输入点 p,使用结构找到所有点 q,使得 d(p, q) ≤ 2R。对于每个点 q,有一个或两个在其边界上包含 p 和 q 的圆。通过求解一些二次方程找到它们的中心,然后在 q 的其他选择中查找来确定子集。

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多