分段树空间要求

Segment tree space requirement

本文关键字:空间 分段      更新时间:2023-10-16

我发现,正如HackerEarth上的这篇文章所解释的那样,段树可以通过使用数组来实现,其中位于array-index n的节点的子元素位于索引2n2n+1

还指出,为了在我的段树中存储n元素,我需要2n+1个节点。

然而,最近当我解决了一些与段树相关的问题时,有时我的代码给出了运行时错误,当我将存储段树的数组大小更改为4 x(存储在段树中的数组大小)时,这个问题得到了解决。我怎么能确定一个段树实际上需要4n个大小的数组,有n个元素

如果你擅长俄语,请阅读这篇文章:http://e-maxx.ru/algo/segment_tree

如果你不是,我将描述它所说的:我们需要注意,使用这种枚举(i的左子是2i,右子是2i+1),包含段树的数组的大小将不是2n,而是4n。问题是:当n不是2的幂时,这个枚举不能完全正常工作——在这种情况下,我们得到"跳过"的数字,这些数字没有分配给任何树的顶点(它们的意思是"节点")。实际上,它的工作原理就好像我们将n四舍五入到最接近2的幂。它并没有使实现变得更复杂,但迫使我们将数组的大小增加到4n

编辑:以下是上述文章的英文版本:https://cp-algorithms.com/data_structures/segment_tree.html

2N+1节点使用给定的方法定位子节点,如果N小于2的幂(或者如果树是平衡的,并且缺失的叶节点都在底部行的右边,类似于本文中的第一个树形图)。否则,将节点的索引翻倍以获得其子节点将超出数组的边界。看看本文中间的图表(顶部节点中有"36"的树)。"16"节点的索引为6,因此它的子节点位于节点12和13。节点"5"没有任何子节点(它们应该在节点10和11中)。这些缺失的节点仍然需要在数组中为它们提供插槽。