如何编写一个查找范围数组中所有交叉点的方法?

时间:2011-10-31 20:51:12

标签: arrays algorithm set intersection intervals

我有与此类似的数组

[
 [0, 10]**,
 [1, 3]**,
 [5, 11]**,
 [14, 20]**,
 [10, 11]**
]

**表示包含数组

中显示的起始索引和结束索引的对象

现在,交叉点为[1, 3], [5,10], [10,11]

编写返回包含相交集的对象的方法的最佳方法是什么? (我们可以将它们存储在一系列冲突的东西中)

我遇到的最大问题是如何将每个对象与其他对象进行比较?

有n!这样做的方法(我想,我的组合学上有点生疏)

1 个答案:

答案 0 :(得分:0)

按开始时间对间隔进行排序(或者按开始时间对索引数组进行排序,这样就不会丢失索引)。

在此之后,您可以执行一次检测所有交叉点/冲突。

Range array[N];

sort(array);
int i=0;
while(i<N){
    Range curr = array[i];  //invariant: curr doesn't intersect with anyone befor it
    i++;
    while(i < N && array[i].start <= curr.end){
        output that curr and array[i] intersect;
        if(array[i].end > curr.end){
            curr = array[i]
        }
        i++;
    }
}