Skip to content

模型Model

区间树

Interval tree · Centered interval tree

按中心点递归分配区间,用两套端点次序实现静态点刺与交叠报告,并区分固定坐标骨架的动态成本。

形式陈述 ​

静态中心区间树 ​

“Interval tree”有多种结构。本页先定义静态 centered interval tree。输入是 n 个闭区间 I=[low(I),high(I)],其中 low(I)≤high(I);只在端点接触也算相交。重复区间以独立 interval-id 保存,查询报告对象实例。

对非空区间集,取全部端点的一个中位数为中心 c。所有包含 c 的区间留在当前节点:一份引用表按 low 递增,一份按 high 递减;满足 high<c 的区间递归进入左子树,满足 low>c 的进入右子树。每个区间恰好归属一个节点。中心值形成一棵二叉搜索树,端点表则保存归属该中心的区间。

中位数划分使两侧各至多留下原区间数的一半,因而树高 H=O(log⁡(n+1))。每个非空节点至少留有一个区间,因为中心本身是某个区间的端点。端点预排序后逐层线性划分,可在 O(nlog⁡(n+1)) 时间构建;每个区间只存两份引用,总存储为 O(n)。以下查询界对 n≥1 陈述;空树直接在常数时间返回空结果。

点刺查询 ​

查询点 q。在中心 c:

  • 若 q<c,扫描 low 递增表,报告所有 low≤q,遇首个 low>q 停止;这些区间都含 c>q,故 high 约束已经成立。随后只递归左子树。
  • 若 q>c,对 high 递减表对称扫描至 high<q,随后只递归右子树。
  • 若 q=c,节点存放的全部区间都命中,子树没有包含 c 的区间。

搜索只走一条中心路径。列表扫描除每个节点至多一次停止比较外,每个元素都实际输出,所以报告 k 个区间的最坏时间为

O(H+k)=O(log⁡(n+1)+k).

区间交叠查询 ​

查询闭区间 Q=[l,r],其中 l≤r。若 r<c,当前节点只需从 low 表报告 low≤r 的前缀,再递归左侧;若 l>c,从 high 表报告 high≥l 的前缀,再递归右侧。

若 l≤c≤r,当前节点全部区间都与 Q 相交,并递归两侧。静态构造保证每个这样的节点至少报告一个此前未报告的归属区间。中心在查询范围外的已访问节点,只可能位于两条边界搜索路径上。因此节点访问与停止比较共 O(H+k),报告时间也是 O(log⁡(n+1)+k)。

直觉

跨过中心的区间留在当前节点,其余区间完整落在一侧。查询点相对中心的位置让一个端点约束自动成立,只需按另一端的次序扫描。静态构造还把每个中心与至少一个归属区间绑定:范围查询同时展开两侧时,这个区间正好为节点访问付款。

中心区间树与点刺查询
例子与边界

日程冲突 ​

区间集合为

[9,11], [10,12], [13,15], [14,17].

查询新会议 [11,14] 时,闭区间约定下四项都冲突:[9,11] 在端点 11 接触,另外三项也与查询区间有公共点。若业务采用半开区间 [start,end),则 [9,11) 与 [14,17) 都不和 [11,14) 相交;分组、扫描和交叠判定中的严格性必须一并调整。

若两个会议恰好都有区间 [10,12],结果中仍有两个不同 id。删除一个实例时,只应移除该 id 的两份引用。

固定坐标骨架的动态版本 ​

若可能出现的 M≥1 个不同端点坐标预先已知,可先按坐标中位数建立固定中心骨架。高度是 O(log⁡(M+1)),即使当前仅有 n 个活动区间,骨架仍占 O(M) 空间。区间沿中心路径找到唯一归属节点,再插入或删除其两张端点表。

把每张表实现为平衡搜索树,并维护极端元素指针和常数时间逐项前进的链,则一次更新最坏花费 O(log⁡(M+1)+log⁡(n+1)),总空间 O(M+n)。点刺查询仍只有一条路径,故为 O(log⁡(M+1)+k)。这里表的顺序扫描条件很重要,逐项重新搜索后继会增加成本。

范围查询的上述递归在这一版本中需要 O(V+k),其中 V 是访问的骨架节点数。删除可能把节点的归属表清空:若全体区间都已删除,而查询覆盖整个坐标域,递归仍会访问全部 Θ(M) 个中心,却输出零项。因此静态版本的“每个展开中心都能向一个输出收费”证明不再适用。要给动态范围报告建立更强的输出敏感界,需要另行设计剪枝、重建或其他索引机制,并证明其维护成本。

推论与应用

与 max-high 增强搜索树的区分 ​

另一经典结构按 low 建红黑树,并在节点保存子树最大 high。它能在最坏 O(log⁡(n+1)) 时间找到一个相交区间,插删时按搜索树增强更新 max-high。

报告全部命中需要相应的递归剪枝与独立的输出敏感分析。“找到一个”的界本身没有控制连续搜索、重复访问和全部报告的总成本。中心区间树的两张端点表与 max-high 搜索树的摘要承担不同作用。

与线段树的区分 ​

线段树递归分解坐标域或数组索引,一个输入区间可能覆盖多个规范节点,常用于区间聚合和批量更新。中心区间树递归分配区间对象,每个对象归属一个包含其中心的节点,查询输出对象实例。选型时应先明确要聚合数值、寻找一个命中,还是报告全部实例,再比较相应的空间与更新界。

参考资料
  • David M. Mount, CMSC 420: Data Structures, University of Maryland, Fall 2019, “Interval Trees”:端点中位数构造与点刺查询。
  • Mark de Berg et al., Computational Geometry: Algorithms and Applications, 3rd ed., Springer, 2008, Chapter 10.
  • Thomas H. Cormen et al., Introduction to Algorithms, 4th ed., MIT Press, 2022, Section 17.3:max-high 增强搜索树版本。
关系图谱8 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系