用于找到间隔交叉点的算法

时间:2010-06-08 02:07:13

标签: algorithm

我想知道如何找到与之前相交的间隔数。 我们想知道他的对数(i,j),其中i< j,这样内部i∩间隔j =∅。 例如,对于区间[2,4],[1,6],[5,6],[0,4],输出应为2. [2,4] [5,6]和[5, 6] [0,4]。

所以现在我们有一组大小为n的区间都包含一个点a,然后我们添加另一组大小为n的区间,所有区间都在a的右边。你能用O(nlgn)和O(nlg ^ 2n)吗?

1 个答案:

答案 0 :(得分:1)

如果第一段的答案是间隔的集合,那么请查看范围树和间隔树数据结构,并忽略我要说的其余部分。

如果第一段的答案是简单计数,则范围树和间隔树不是您想要的,因为搜索的成本会随着找到的交叉间隔的数量而增加。但请注意,如果我< j和间隔i与间隔j相交,然后间隔j与间隔i相交,因此如果你检查间隔i,j,使得i>那么你还是会看到一场比赛。这意味着您得到的答案并不取决于您提供时间间隔的顺序,因此您可以选择适合自己的时间。

按照增加第一个坐标的顺序对间隔进行排序并逐个进行处理,保持到目前为止看到的间隔队列通过减少第二个坐标来排序。当您看到新的间隔时,从队列中删除之前看到的具有第二个坐标的所有间隔,这意味着它不与新间隔相交。新区间将与其他所有区间相交,因此累积找到的交叉点数,将新区间添加到队列中,然后继续。

这可以计算出时间n log n中的交叉点数。如果您想要非交叉点的数量,请从n(n-1)/ 2中减去它。