一尘不染

如何获得两个范围的重叠范围

algorithm

我在间隔[1-15]中有以下范围

我想找到人1和2之间的重叠范围。

Person1 [1,3] [5,10] Person2 [2,4] [8,15]

在这里,我应该获得[2,3],[8、10]的范围列表。

到目前为止,我发现的是按person1的范围,然后按person2的范围,然后针对每个范围的每个元素,然后使用条件测试来循环。这个解决方案令我不满意,因为它是O(n)。更多的元素范围,更多的算法将为每个范围的每个元素循环,如果我想查看这些范围之间的切面,那将需要一些时间

人员1:[100000; 150000]和[90000; 140000]。人2:[105000;110000]和[130000; 140050]

请注意,范围在我的代码中表示为:

public class Range{
    public int Start {get;set;}
    public int End {get;set;}
}

那么,找到重叠范围的最有效方法是什么?

任何帮助,将不胜感激。

PS:这里也有类似的问题,如何在python中查找范围重叠?但我不懂python代码。


阅读 310

收藏
2020-07-28

共1个答案

一尘不染

看一下mergesort算法的合并步骤。如果对每个人的范围进行了排序,则该方法可以非常容易地用于计算重叠。

Loop
   Get the range that starts next (R1)
   if the next range of the other person (R2) starts before R1 ends
      Add the range from begin of R2 and min( end of R1 end of R2 ) to results
   Increase the counter for the person which gave you R1

如果您的范围已知是不相邻的(即,如果连续范围之间始终至少有一个数字)。解决方案也将是。否则,您可能需要执行额外的压缩步骤,以确保将相邻范围放入一个范围。

令人高兴的是,这适用于任何有序类型,而不仅仅是int,并且您可以非常快速地相交任意数量的范围(O(n + m))。

2020-07-28