【问题标题】:What are the differences between segment trees, interval trees, binary indexed trees and range trees?段树、区间树、二叉索引树和范围树有什么区别?
【发布时间】:2023-08-18 22:19:01
【问题描述】:

线段树、区间树、二叉索引树和范围树在以下方面有什么区别:

  • 关键思想/定义
  • 应用
  • 更高维度的性能/订单/空间消耗

请不要只给出定义。

【问题讨论】:

  • 它不是重复的,那个问题是芬威克树是否是区间树的概括,我的问题更具体和不同。
  • *.com/questions/2795989/…没有回答,那里的答案只是给出了定义。
  • 怎么太宽泛了? “x 和 y 有什么区别?”尽可能清晰和专注。这是一个很好的问题。
  • 而且在任何地方都没有很好的答案。一个好的答案将对社区非常有用
  • 这些数据结构中的大部分(除了 Fenwick 树)都在此 pdf 中进行了审查:"Interval, Segment, Range, and Priority Search Trees"(作者 D. T. Lee)。或者您可以将其作为本书的一章阅读:"Handbook of Data Structures and Applications"

标签: algorithm tree graph-algorithm interval-tree segment-tree


【解决方案1】:

所有这些数据结构都用于解决不同的问题:

  • 段树存储区间,并针对“哪些区间包含给定点”查询进行了优化。
  • 区间树也存储区间,但针对“哪些区间与给定区间重叠”查询进行了优化。它也可以用于点查询——类似于线段树。
  • 范围树存储点,并针对“哪些点落在给定区间内”查询进行了优化。
  • 二进制索引树存储每个索引的项目数,并针对“索引 m 和 n 之间有多少项目”查询进行了优化。

一维的性能/空间消耗:

  • 分段树 - O(n logn) 预处理时间,O(k+logn) 查询时间,O(n logn) 空间
  • 区间树 - O(n logn) 预处理时间,O(k+logn) 查询时间,O(n) 空间
  • 范围树 - O(n logn) 预处理时间,O(k+logn) 查询时间,O(n) 空间
  • 二叉索引树 - O(n logn) 预处理时间,O(logn) 查询时间,O(n) 空间

(k是报告结果的数量)。

所有数据结构都可以是动态的,因为使用场景包括数据更改和查询:

  • 分段树 - 可以在 O(logn) 时间内添加/删除间隔(参见 here
  • 区间树 - 可以在 O(logn) 时间内添加/删除区间
  • 范围树 - 可以在 O(logn) 时间内添加/删除新点(请参阅 here
  • 二进制索引树 - 每个索引的项目数可以在 O(logn) 时间内增加

更高维度(d>1):

  • Segment tree - O(n(logn)^d) 预处理时间,O(k+(logn)^d) 查询时间,O(n(logn)^(d-1)) 空间李>
  • 区间树 - O(n logn) 预处理时间,O(k+(logn)^d) 查询时间,O(n logn) 空间
  • 范围树 - O(n(logn)^d) 预处理时间,O(k+(logn)^d) 查询时间,O(n(logn)^(d-1))) 空间
  • 二叉索引树 - O(n(logn)^d) 预处理时间,O((logn)^d) 查询时间,O(n(logn)^d) 空间

【讨论】:

  • 我真的从中得到了段树
  • @j_random_hacker:基于分段树的算法在区间查询的某些更复杂的高维变体中具有优势。例如,查找哪些非轴平行线段与 2D 窗口相交。
  • 谢谢,我对您能提供的任何详细说明感兴趣。
  • @j_random_hacker,段树还有另一个有趣的用途:在 O(log N) 时间内进行 RMQ(范围最小查询),其中 N 是整个间隔大小。
  • 为什么段树是 O(n log n) 空间?他们存储 N 个叶子 + N /2 + N/4 + ... + N/2^(log N),如果我没记错的话,这个总和是 O(N)。 @icc97 的回答也报告了 O(N) 空间。
【解决方案2】:

并不是说我可以在Lior's answer 中添加任何内容,但似乎可以使用一张好表。

一维

k是报告结果的数量

Operation Segment Interval Range Indexed
Preprocessing n logn n logn n logn n logn
Query k+logn k+logn k+logn logn
Space n logn n n n
Insert/Delete logn logn logn logn

更高的维度

d > 1

Operation Segment Interval Range Indexed
Preprocessing n(logn)^d n logn n(logn)^d n(logn)^d
Query k+(logn)^d k+(logn)^d k+(logn)^d (logn)^d
Space n(logn)^(d-1) n logn n(logn)^(d-1)) n(logn)^d

【讨论】:

  • 报告结果是什么意思?
  • @ps06756 搜索算法通常具有 log(n) 的运行时间,其中 n 是输入大小,但可以产生在 n 中线性的结果,这不能在对数时间内完成(在 log 中输出 n 个数字(n) 时间是不可能的)。
  • 段树不应该在第一个表中有O(n logn) space吗?
【解决方案3】:

段树和二叉索引树的预处理和空间界限可以改进:

【讨论】: