我有一组线条,我想要计算这些线条在一些圆圈内相交的数量。
这应该可以使用扫描线算法在O(nlogn)
中解决。我所做的是我首先发现了一个圆圈内的所有线段(也就是说,对于每条线,我计算了两个与圆的交点并得到了线段,但如果没有交叉点,我只是忽略了那条线。)
然后,我尝试采用Bentley-Ottmann算法,但是它是O(nlogn)
而不是O((n+k)logn)
,其中k
是所有交叉点的数量,我将不得不跳过算法的一部分,它将交叉点插入事件队列并处理它们就像处理所有找到的线段的端点一样,但算法不起作用,所以没有去(相关:Is there an efficient way to count the number of intersections among a given set of line segments? )
基本上,我无法找到针对此问题的任何特定漏洞,这会产生扫描线算法O(nlogn)
。这里可以利用的事情是我们基本上寻求在圆圈内的线段(和弦!)之间交叉的事实,并且我们只需要计算它们(更精确的是,有多少对线段在它们之间有交叉点) ,所以可能会发生重复!)。