algorithm - 找到所有给定圆圈覆盖的点
问题描述
给定 n (n <= 1000) 个圆 ((x;y), r) 其中 (x;y) = 圆心坐标,r = 半径。x, y, r <= 10^6。x, y, r, 可以是实数。
问题是找到所有圆圈覆盖的点(x;y),或者确定没有这样的点。点坐标也可以是实数。
不知道怎么做,有人可以帮忙吗?
解决方案
假设你所说的圆圈是数学家所说的封闭圆盘,那么就有一个具有简单数据结构的 O(n²) 时间算法。
对于从 1 到 n 的 k,算法在前 k 个磁盘的交点中找到一个点,假设存在这样的点。从第一个磁盘的中心开始。对于第一个之后的每个磁盘,检查当前点是否属于该磁盘。如果是这样,那就太好了。如果不是,则交点为空,或者交点包含当前圆盘边界上的一个点(从当前点到所有圆盘交点中任意点的线段必须穿过边界)。在这种情况下,通过将边界(一个圆)与之前的每个圆盘相交来找到一个新点,这是一个更简单的一维问题。
如果我们随机化磁盘的顺序,这可能会更快,但我还没有得出一个证明。当 n ≤ 1000 时,希望 O(n²) 足够快。
Sharir ("Intersection and Closest-Pair Problems for a Set of Planar Discs", 1985) 可能给出了 O(n log² n) 时间算法,但我无法从摘要中看出。
推荐阅读
- tensorflow - 如何使用 tf.tensor_scatter_nd_update 设置索引以获取 3D 张量的最后一维?
- java - 检查字符串中的整数(java zybooks)
- linux - 我正在尝试在 Ubuntu 上从 bash 运行文件
- typo3 - 我如何在打字稿中实现流体
- c - 使用指针算法打印 3D 数组元素的指针
- html - 为什么我的整个 div 都是可点击的,而不仅仅是链接?
- jenkins - 是否可以根据来自 2 个 repos 的 GitHub webhook 设置 Pipeline 作业以触发?
- intellij-idea - 禁用嵌套级别提示
- wordpress - 如何停止从http重定向到https?
- jquery - 如何使用 iziToast 显示 toast 消息