C++ 段树数据结构中的数组大小

C++ 段树数据结构中的数组大小,c++,arrays,data-structures,tree,segment-tree,C++,Arrays,Data Structures,Tree,Segment Tree,在段树中,我们在数组上方构建段树。 例如,如果数组大小为8[0-7]索引。 段树中的节点数为15,即第1、2、3、4级中的1、2、4、8个 但在一个问题中,如果我将结构数组大小声明为seg tree[2*N+1]它给出了错误的答案,而如果我将其声明为如下 struct seg{ int sum; }; seg tree[4*N + 1]; 它给出了错误的答案。我怀疑[2*N]是否足够,那么为什么它给出了错误的答案。 节点段(1-1)的编号为9,其父节点的编号为4。所以左子代是2*N右子代

在段树中,我们在数组上方构建段树。
例如,如果数组大小为8[0-7]索引。
段树中的节点数为15,即第1、2、3、4级中的1、2、4、8个


但在一个问题中,如果我将结构数组大小声明为
seg tree[2*N+1]
它给出了错误的答案,而如果我将其声明为如下

struct seg{ 
 int sum;
};
seg tree[4*N + 1];
它给出了错误的答案。我怀疑[2*N]是否足够,那么为什么它给出了错误的答案。

节点段(1-1)的编号为9,其父节点的编号为4。所以左子代是2*N右子代是2*N+1

N
成为初始数组的大小。段树的大小为:

  • 2*n-1
    如果
    n
    是2的幂
  • 2*2^(log_2(n)+1)-1
    如果
    n
    不是2的幂
编辑:的确,我们可以创建一个大小为
2*n-1
的数组,从理论上构建一棵树,但请思考如何在段树的数组表示中从父级到子级?左侧子项将位于索引
2*i+1
(基于0的索引),右侧子项将位于索引
2*i+2
。为了保持这个不变量,我们必须构造完整的二叉树,公式如上所述


您也可以参考。

n
为初始数组的大小。段树的大小为:

  • 2*n-1
    如果
    n
    是2的幂
  • 2*2^(log_2(n)+1)-1
    如果
    n
    不是2的幂
编辑:的确,我们可以创建一个大小为
2*n-1
的数组,从理论上构建一棵树,但请思考如何在段树的数组表示中从父级到子级?左侧子项将位于索引
2*i+1
(基于0的索引),右侧子项将位于索引
2*i+2
。为了保持这个不变量,我们必须构造完整的二叉树,公式如上所述


你也可以参考。

让我拿我的水晶球out@Sparrow
int sum
@ShubhamBhattar之后没有分号,它是固定的。它可能给出了编译错误?但如果我把它改成2*N让我拿我的水晶球out@Sparrow
int sum
@ShubhamBhattar之后没有分号,它是固定的。它可能给出了编译错误?但是如果我把它改成2*N,那么它的大小应该小于2*N。对于任何给定的N,最大值节点数是2*N-1。归纳法:1-1,2-3,3-5,4-9,5-9,6-11,7-13,…,N-2N-1对于
N=5
,段树的大小将是15而不是10。对于n=5,如果段[0-4]的编号为1,则最大节点值出现在[1-1](编号9,即2*n-1)是否查看了上述公式?如果
n=5
log_2(5)=2
2*(2^(2+1))-1=15
。无论哪种方式,大小都应小于2*n。对于任何给定的n,最大值节点数为2*n-1。归纳:1-1,2-3,3-5,4-9,5-9,6-11,7-13,…,n-2N-1对于
n=5
,段树的大小将是15,而不是10。为什么是15。对于n=5,如果段[0-4]的编号为1,则最大节点值出现在[1-1](编号9,即2*n-1)是否查看了上述公式?如果
n=5
log_2(5)=2
2*(2^(2+1))-1=15