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

时间:2013-07-04 09:04:40

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

分段树,间隔树,二进制索引树和范围树之间的区别在于:

  • 关键理念/定义
  • 应用程序
  • 更高维度/空间消耗的性能/订单

请不要只给出定义。

3 个答案:

答案 0 :(得分:275)

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

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

答案 1 :(得分:20)

并非我可以向Lior's answer添加任何内容,但似乎可以使用好的表格。

One Dimension

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中创建的 - 如果您想要图像,请参阅Gist

答案 2 :(得分:0)

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