225

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

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

请不要只给出定义。

4

3 回答 3

364

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

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

一维的性能/空间消耗:

  • Segment tree - 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) 时间内添加/删除间隔(参见此处
  • 间隔树- 可以在 O(logn) 时间内添加/删除间隔
  • 范围树- 可以在 O(logn) 时间内添加/删除新点(参见此处
  • 二进制索引树- 每个索引的项目数可以在 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) 空间
于 2013-07-06T15:49:08.683 回答
28

并不是说我可以在Lior 的回答中添加任何内容,但似乎可以用一张好桌子来做。

一维

k是报告结果的数量

手术 分割 间隔 范围 索引
预处理 登录 登录 登录 登录
询问 k+logn k+logn k+logn 登录
空间 登录 n n n
插入/删除 登录 登录 登录 登录

更高维度

d > 1

手术 分割 间隔 范围 索引
预处理 n(logn)^d 登录 n(logn)^d n(logn)^d
询问 k+(logn)^d k+(logn)^d k+(logn)^d (登录)^d
空间 n(logn)^(d-1) 登录 n(logn)^(d-1)) n(logn)^d
于 2016-01-09T22:07:18.853 回答
0

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

于 2021-03-21T17:16:38.790 回答