我有与此类似的数组
[
[0, 10]**,
[1, 3]**,
[5, 11]**,
[14, 20]**,
[10, 11]**
]
**表示包含数组
中显示的起始索引和结束索引的对象现在,交叉点为[1, 3], [5,10], [10,11]
编写返回包含相交集的对象的方法的最佳方法是什么? (我们可以将它们存储在一系列冲突的东西中)
我遇到的最大问题是如何将每个对象与其他对象进行比较?
有n!这样做的方法(我想,我的组合学上有点生疏)
答案 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++;
}
}