繁体   English   中英

段树、区间树、二叉索引树和范围树有什么区别?

[英]What are the differences between segment trees, interval trees, binary indexed trees and range trees?

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

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

请不要只给出定义。

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

  • 段树存储区间,并针对“这些区间中的哪一个包含给定点”查询进行了优化。
  • 间隔树也存储间隔,但针对“这些间隔中的哪些与给定间隔重叠”查询进行了优化。 它也可以用于点查询——类似于线段树。
  • 范围树存储点,并针对“哪些点落在给定间隔内”查询进行了优化。
  • 二叉索引树存储每个索引的项目数,并针对“索引 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) 时间内添加/删除间隔(请参阅此处
  • 间隔树- 可以在 O(logn) 时间内添加/删除间隔
  • 范围树- 可以在 O(logn) 时间内添加/删除新点(请参阅此处
  • 二叉索引树- 每个索引的项目数可以在 O(logn) 时间内增加

更高维度(d>1):

  • 段树- 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) 空间

并不是说我可以在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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM