arrays - 如何编写一个方法来查找范围数组中的所有交集?

标签 arrays algorithm set intersection intervals

我有类似这样的数组

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

** 表示包含数组中显示的开始和结束索引的对象

现在,交点是 [1, 3]、[5,10]、[10,11]

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

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

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

最佳答案

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

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

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++;
    }
}

关于arrays - 如何编写一个方法来查找范围数组中的所有交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7959579/

相关文章:

c# - 数组的数组

Javascript:如何根据数据对象数组检查混合用户输入?

javascript - 如何使用 Backbone.js 在模型上设置动态属性

algorithm - 最短路径算法

c# - 查看字符串中是否存在关键字的算法

c++ - C++ 中的这些 extern 声明有什么区别?

c++ - 访问数组之外​​的内存,二叉堆树

algorithm - 如何有效地确定两个列表是否包含以相同方式排序的元素?

algorithm - 高效的子集枚举

C++ 寻找 std::sets 并集的惰性方法