Algorithm 检查两个时间间隔数组是否重叠的优化解决方案?

Algorithm 检查两个时间间隔数组是否重叠的优化解决方案?,algorithm,optimization,data-structures,time,intervals,Algorithm,Optimization,Data Structures,Time,Intervals,您能否以优化的方式找到两个时间间隔数组是否重叠? 假设输入数组A包含10个元素,每个元素都有一个开始日期和结束日期,类似地,输入数组B包含4个元素,每个元素都有一个开始数据和结束数据。现在找出A和B是否重叠 示例1: 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 2eleme

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

示例1:

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={[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在[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={[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].startB[j].start),需要O(N*M),其中N是数组A的长度,M是数组B的长度


您可以优化解决方案吗。

以下是您可以做的

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

  • 对于(li,ri)中的每个间隔,更新段树,以便将间隔(li,ri)中的每个元素更新为1。这可以使用延迟传播在O(logn)中完成

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

  • 如果总和为0,则该范围不重叠。否则它是重叠的


  • 总体复杂性O(nlogn)

    您可以根据开始时间对阵列进行排序。然后,通过同时迭代两个数组(使用两个指针),可以检查元素的结束时间是否大于下一个元素的开始时间。如果是这样的话,那么您已经发现了重叠。

    虽然这样做有效,但对于这个问题,分段树有点过分了。在处理段上的简单和时,如果数据不随时间变化(我们只询问问题,不添加或删除段),段树可以替换为预先计算的前缀和:每X的间隔[0,X]上的和。此后,[A,B]上的和就是[0,B]上的和减去[0,A-1]上的和。初始化后(可能需要对输入进行排序),它们的使用速度更快,O(1)而不是O(logn),并且执行相同的任务。所提到的“预计算前缀和”方法本质上与@yashmahajan的另一个答案在概念上类似。