Algorithm 检查两个点之间是否存在路径,中间有障碍物

Algorithm 检查两个点之间是否存在路径,中间有障碍物,algorithm,Algorithm,给出一个圆心坐标和半径的圆列表 [(x,y,r) ...] 和两条平行于x轴的线 ymin = m ymax = n 我想知道一个粒子是否能够在严格地介于ymin和ymax之间的空间内从-无穷远移动到无穷远,并且不与任何一个圆碰撞(即,它不能越过ymin和ymax并穿过这些圆) 参考资料 这是我的方法 1. Sort circles by x 2. Create a list of circle groups such that, - Any pair of circles

给出一个圆心坐标和半径的圆列表

[(x,y,r) ...]
和两条平行于x轴的线

ymin = m
ymax = n
我想知道一个粒子是否能够在严格地介于ymin和ymax之间的空间内从-无穷远移动到无穷远,并且不与任何一个圆碰撞(即,它不能越过ymin和ymax并穿过这些圆)

参考资料

这是我的方法

1. Sort circles by x
2. Create a list of circle groups such that, 
  - Any pair of circles between two different groups never overlap &
  - A group cannot have a forest of circles i.e. they are connected one way or the other if you follow the overlapping circles in them
3. Go through each group and if in any group, the min(g'y) <= ymin & max(g'y) >= ymax then return false. true if no such group satisfies the condition

很抱歉,python代码不惯用(不是这方面的专家)

我认为你做得很好。正如您所说,您需要优化步骤2

为什么第2步是O(N^2)?

如上图所示,红色圆圈不与绿色圆圈重叠,但蓝色圆圈与红色重叠。这个场景使它成为O(N^2),其中N是圆的数目。按x坐标对圆列表排序有帮助吗?你能试着克服这一点吗

弱提示:你能用一些空间来换取更好的时间复杂度吗

停在这里,想想。也许你自己会明白的。如果没有,请返回并进一步阅读

有意间隔,以避免无意中读取解决方案

strong提示:您可以尝试使用直径而不是中心坐标吗

停在这里,想想。也许你自己会明白的。如果没有,请返回并进一步阅读

有意间隔,以避免无意中读取解决方案

解决方案:它应该与上述提示直接对应

  • 只需将圆列表转换为直径的x坐标列表,如
  • 按x_开始排序
  • 使用x_起点和x_终点检查重叠直径。如果直径重叠,圆圈也会重叠,对吗?不检查圆是否真的重叠。这就是我们在上面的步骤1中存储circle_索引的原因。圆圈索引是给定圆圈输入列表中圆圈的索引。请参见下图以了解更多信息
  • 从第3步开始,您知道一组重叠的圆。正如你在文章中所做的那样,检查它们是否阻止粒子向无穷远移动
  • 步骤2使此解决方案
    O(NlogN)
    。其余步骤为
    O(N)
    。事实上,在第2步之后,您可以一次完成所有操作

    跟进: 你看到任何边缘的情况吗?上面的算法能处理吗?检查下面的图片

    作为一个简单的跟进,我想让你们注意到有相同x_起点和x_终点的圆


    谢谢!我喜欢解决这个问题。真有趣!你是在哪里发现这个问题的?是的,我确实得到了提示,这是一个重叠的时间间隔问题,但在某些情况下,使用中心坐标并没有真正起作用。坦白地说,我看过你的解决方案后感到很惊讶。xstart,xend是一个不错的选择。伟大的洞察力@我很高兴你喜欢它。这是个好问题。所以,我很好奇这个问题的来源。这是我采访的一部分yesterday@FaizHalde当前位置我也这么觉得。40分钟思考和完美编码的好问题,尤其是所有边缘案例。如果以前没有见过的话,我会被评为更高、中等或硬。是的,我看到了,不幸的是这不是真的。即使使用这种排序,我描述的场景也是可能的。你必须考虑它是2D。