用于检查两次间隔阵列是否重叠的优化解决方案?

时间:2017-08-22 06:09:07

标签: algorithm optimization data-structures time intervals

您能否以优化的方式找到两次间隔阵列是否重叠? 假设输入数组A包含10个元素,并且每个元素都有一个开始日期和结束日期。同样,输入数组B包含4个元素,每个元素都有一个开始数据和结束数据。现在找出A和B是否重叠?

示例1:

输入:

A={[1,5],[7,10],[11,15]}; //Array A contains 3elements, and each element have start and end time.
B={[6,10],[1,5]};//Array B contains 2elements, and each element have start and end time.

输出: 是//为什么因为A和B在[6,10] ||重叠[1,5]

示例2:

输入

A={[1,5],[8,10],[11,15]}; //Array A contains 3elements, and each element have start and end time.
B={[5,8],[15,16]};//Array B contains 2elements, and each element have start and end time.

输出: 否//为什么因为A和B在[5,8] ||处不重叠[15,16]

我知道我们可以通过迭代每个元素来使用强力来解决这个问题 在B中并且与A的每个元素进行比较以检查是否重叠(A [i] .start< = B [j] .start和A [i] .end> B [j] .start),它'取O(N * M),其中N是阵列A的长度,M是B的长度。

请您优化解决方案。

2 个答案:

答案 0 :(得分:1)

您可以根据开始时间对数组进行排序。然后,您可以通过同时迭代两个数组来检查元素的结束时间是否大于下一个元素的开始时间(使用两个指针)。如果是这种情况,那么您已找到重叠。

答案 1 :(得分:0)

这是你可以做的事情

  1. 使用数组A的值构建段树。如果第一个区间id(l1,r1),第二个是(l2,r2),依此类推。

  2. 对于A(li,ri)中的每个区间更新分段树,以便我们将区间(li,ri)中的每个元素更新为1.这可以使用在O(logn)中完成懒惰传播

  3. 现在,对于B(lj,rj)中的每个间隔,尝试查询该范围的段树。查询将返回范围(lj,rj)

  4. 的总和
  5. 如果sum为0,则该范围不重叠。否则它重叠

  6. 总体复杂性 O(nlogn)