分段树空间要求
Segment tree space requirement
我发现,正如HackerEarth上的这篇文章所解释的那样,段树可以通过使用数组来实现,其中位于array-index n的节点的子元素位于索引2n和2n+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中)。这些缺失的节点仍然需要在数组中为它们提供插槽。
- 分段故障(堆芯转储)矢量
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 数组的指针从不分段故障
- 在命名空间中定义函数还是限定函数
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 在线编译器中的分段C++没有打印消息
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 使用命名空间时出现多个定义错误
- 分段错误当我试图运行程序时出错
- 写入 std::vector 的保留空间会导致分段错误吗?
- 如何处理堆栈外空间分段错误
- 分段树空间要求