段树、区间树、二叉索引树和范围树之间的区别是什么:

关键理念/定义 应用程序 高维的性能/顺序/空间消耗

请不要只是给出定义。


当前回答

并不是说我可以在Lior的回答中添加任何东西,但它似乎可以用一个好的表格来做。

一维

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 >

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

其他回答

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

Segment tree stores intervals, and optimized for "which of these intervals contains a given point" queries. Interval tree stores intervals as well, but optimized for "which of these intervals overlap with a given interval" queries. It can also be used for point queries - similar to segment tree. Range tree stores points, and optimized for "which points fall within a given interval" queries. Binary indexed tree stores items-count per index, and optimized for "how many items are there between index m and n" queries.

一维性能/空间消耗:

段树- 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是报告结果的数量

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 >

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

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

段树可以存储在2n的空间中,然后使用动态规划在2n = O(n)中构建,如果您放弃在任意点上添加间隔:https://cp-algorithms.com/data_structures/segment_tree.html#toc-tgt-6 BIT可以在n中建立,看这个答案:是否可能在O(n)中建立芬威克树? BIT还支持将end追加为O(log(n))时间的操作