区间重叠

概述

区间重叠(Interval Overlap)是判断两个闭区间是否有交集的操作。它是 区间树 支持的核心查询原语,也是计算几何、日程调度、资源分配等领域的基本操作。两个闭区间 重叠的判定条件为 ,即一个区间的起点不超过另一个区间的终点。

定义

区间重叠

给定两个闭区间 (其中 ),称 重叠(overlap),当且仅当:

等价地, 不重叠(即完全分离),当且仅当:

即一个区间的终点严格小于另一个区间的起点。

判定的直观理解

两个区间重叠,意味着它们在数轴上有公共部分。两个区间不重叠,意味着一个区间完全在另一个区间的左边或右边。

不重叠的情况:          重叠的情况:

[a, b]    [c, d]       [a, b]
  ↑        ↑             ↑
  b < c               [c, d]
  (i1 在 i2 左边)        ↑
                     a ≤ d 且 c ≤ b
                     (有公共部分 [c, b])

生活化类比

想象两条时间线上的会议安排:

  • 会议 A:上午 9:00 - 10:30
  • 会议 B:上午 10:00 - 11:30

A 的结束时间(10:30)> B 的开始时间(10:00),且 B 的结束时间(11:30)> A 的开始时间(9:00),所以两个会议在时间上有重叠(10:00 - 10:30)。

再看:

  • 会议 C:上午 9:00 - 10:00
  • 会议 D:上午 10:30 - 11:30

C 的结束时间(10:00)< D 的开始时间(10:30),所以两个会议不重叠,中间有 30 分钟的空闲。

核心性质

性质1:判定条件的对称性

区间重叠的判定条件关于两个区间是对称的:

这意味着无论先检查哪个区间,结果相同。

性质2:不重叠条件的互斥性

两个区间不重叠有两种互斥的情况:

  • 完全在 左边:
  • 完全在 右边:

这两种情况不可能同时成立(因为 )。

性质3:重叠的传递性不成立

区间重叠不满足传递性。即:如果 重叠, 重叠, 不一定重叠。

反例:

  • 重叠(公共部分
  • 重叠(公共部分
  • 不重叠

性质4:端点接触算重叠

根据闭区间的定义, 是重叠的(公共点为 )。这是因为 (由 )且 ,两个条件均满足。

如果使用开区间 ,则 不重叠。区间树中通常使用闭区间。

性质5:区间树利用端点排序加速重叠检测

区间树 中,节点按区间的低端点 low 排序(红黑树的中序遍历按 low 递增)。查询时,利用 max 属性(子树中所有区间的最大高端点)进行剪枝:

  • 如果 ,则左子树中所有区间的 ,由不重叠条件 可知,左子树中没有任何区间与 重叠,可以安全剪枝。

这一剪枝策略将查询的期望时间从 降低到

重叠的伪代码

INTERVAL-OVERLAP(i1, i2)
1  if i1.high >= i2.low and i2.high >= i1.low
2      return true
3  else
4      return false

等价的否定形式(不重叠判定):

INTERVAL-NO-OVERLAP(i1, i2)
1  if i1.high < i2.low or i2.high < i1.low
2      return true
3  else
4      return false

重叠的类型

两个区间重叠时,根据重叠的程度,可以分为以下几种类型:

类型条件示例图示
包含一个区间完全包含另一个[===]
部分重叠两个区间有公共部分但互不包含[==]===]
端点接触仅共享一个端点`[==]
完全相同两个区间完全一样[====]

应用场景

区间重叠判定在许多实际问题中有广泛应用:

应用领域具体问题区间含义
日程管理检查会议时间冲突会议的开始和结束时间
资源分配检查资源占用冲突资源被占用的起止时间
基因组学寻找基因片段重叠DNA 片段在染色体上的位置
数据库时间范围查询事件的发生时间范围
网络端口/地址范围冲突网络地址的分配范围
版本控制代码变更冲突检测代码行号的范围

参见