段树,间隔树,二进制索引树和范围树之间有什么区别?


200

在以下方面,段树,间隔树,二进制索引树和范围树之间有什么区别:

  • 关键思想/定义
  • 应用领域
  • 更高尺寸/空间消耗下的性能/订单

请不要仅仅给出定义。


12
它不是重复的,那个问题是fenwick树是否是区间发芽的推广,而我的问题更具体,也有所不同。
Aditya

7
stackoverflow.com/questions/2795989/…上还没有答案,那里的答案只是给出了定义。
Aditya

12
范围如何?“ x和y有什么区别?” 尽可能清晰,专注。这个问题问得好。
IVlad 2013年

16
对于任何地方都没有好的答案。一个好的答案将对社区大有好处
Aditya

22
这份pdf文件中对大多数这些数据结构(Fenwick树除外)进行了回顾:“区间,分段,范围和优先级搜索树”(作者DT Lee)。或者,您可以将其作为本书的一章阅读:“数据结构和应用程序手册”
Evgeny Kluev

Answers:


318

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

  • 段树存储间隔,并针对“ 这些间隔中的哪个包含给定点 ”查询进行了优化。
  • 间隔树也存储间隔,但是针对“ 这些间隔中的哪些与给定间隔重叠 ”查询进行了优化。它也可以用于点查询-与段树类似。
  • 范围树存储点,并针对“ 哪些点在给定间隔内 ”查询进行了优化。
  • 二进制索引树存储每个索引的项目数,并针对“ 在索引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)空间

12
我真的给人的印象是,分割树<间隔树。有什么理由更喜欢段树吗?例如实现简单?
j_random_hacker

7
@j_random_hacker:基于分段树的算法在区间查询的某些更复杂的高维变量中具有优势。例如,找到哪些非轴平行线段与2D窗口相交。
Lior Kogan

5
谢谢,我会对您对此进行的详细说明感兴趣。
j_random_hacker

3
@j_random_hacker,段树还有另一个有趣的用途:O(log N)时间中的RMQ(范围最小查询),其中N是总体间隔大小。
ars-longa-vita-brevis 2014年

1
为什么段树的空间为O(n log n)?他们存储N片叶子+ N / 2 + N / 4 + ... + N / 2 ^(log N),如果我没记错的话,这个和就是O(N)。另外@ icc97回答还报告O(N)空间。
蚂蚁

24

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

一维

k 是报告结果的数量

|              | 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

|              | 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 |

这些表格是在Github格式的Markdown中创建的- 如果您想要表格的格式很好,请参见本要点


2
报告结果是什么意思?
Pratik Singhal'2

@ ps06756搜索算法通常具有log(n)的运行时,其中n是inputsize,但可以产生在n中呈线性的结果,这无法在对数时间内完成(无法在log(n)时间中输出n个数字) 。
oerpli '16

1
段树不应该O(n logn) space在第一个表格中显示吗?
Danny_ds
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.