有六个圆圈由半径和中心坐标表示,我想知道是否存在一个算法,用于查找点P是否存在,使得P在所有圆圈内。
答案 0 :(得分:4)
一个简单的O(n ^ 3)方法是简单地计算每对圆的交点,然后对每个交点测试,看它是否在所有圆中。
将有O(n ^ 2)交点,并且测试每一个都需要O(n),所以总体上它是O(n ^ 3)。
我相信在所有圆圈内可以有点而不是交叉点的唯一方法是,如果最里面的圆圈完全在其他圆圈内,那么你也应该测试每个圆圈的中心。
答案 1 :(得分:3)
如果您可以按顺序计算交叉点,那么您可以获得O(N^2)
算法。
每个圆形交点是一个类似于多边形的凸形图,但带有弧形边。在与n
个第一个圆相交后,您将获得不超过O(n)
个边的交叉区域。因此,为了计算它与下一个(n+1
- 圈)的交集,您需要O(n)
工作。浏览所有N
个圈子,您需要O(N^2)
个工作总数。
此算法的优势还在于其早期终止,并且回答为no
- 如果您在步骤n
上获得空交集,则在后续步骤中不会变为非空。
缺点 - 必须处理" arced"多边形。
答案 2 :(得分:0)
让我们看看O(N)算法是否可行:
1)找出半径最小的圆。将其表示为Cs 2)检查Cs是否被所有其他圆圈完全包围。如果是,则Cs中的任何点都是解决方案。如果不是,请忽略那些完全包含Cs的圈子。这将把圆的数量减少到M,其中M <= N. 3)检查是否有任何圆与Cs相交。如果没有圆与Cs相交,则没有解决方案。如果是,则查找是否有任何交叉点在(M-1)个圆圈的所有其余内。如果是,则交叉点是解决方案。如果没有,那么没有解决方案。
上述所有步骤均为O(N)进行计算,因此整体计算也应为O(N)。