线段树需要开4倍区间大小的数组的原因

转载 2018年04月17日 14:53:49

上网搜了一下,大多写得乱七八糟深奥晦涩难懂,不易理解。其实原因很简单,就是底层不一定是满的,最坏情况下只两个叶子节点,这时就要开4倍空间以避免数组越界了。这篇写得就很好,推荐:点击打开链接

  1. struct list  
  2. {  
  3.     int left;  
  4.     int right;  
  5.     int _max;  
  6. }tree[maxn*4];  
如上述代码所示,我们在写线段树的模板时,别人会告诉我们开4倍的数组就不会溢出了,然而原因是什么,现在证明一下

首先线段树是一棵二叉树,最底层有n个叶子节点(n为区间大小)

那么由此可知,此二叉树的高度为,可证

然后通过等比数列求和求得二叉树的节点个数,具体公式为,(x为树的层数,为树的高度+1)

化简可得,整理之后即为(近似计算忽略掉-1)

证毕

转载地址:https://blog.csdn.net/smoggyxhdz/article/details/78895672



线段树为什么要开4倍空间

假设我们用一个数组来头轻脚重地存储一个线段树,根节点是1,孩子节点分别是2n, 2n+1, 那么,设线段长为L(即[1..L+1)) 设树的高度为H,对H,有: H(L)={1,1+H(⌈L2⌉)...
  • u012313382
  • u012313382
  • 2014-08-11 10:22:12
  • 2993

线段树为什么要开四倍空间

转自: http://scinart.github.io/acm/2014/03/19/acm-segment-tree-space-analysis/ 最近在看《具体数学》,这篇当做是一个...
  • NK_test
  • NK_test
  • 2015-05-12 16:31:49
  • 1424

线段树分配空间大小问题

不要左右节点指针,用一个数组存放线段树。根节点下标为0。假设线段树上某节点下标为i,则:左子节点下标为i*2+1, 右子节点下标为i*2+2如果用一维数组存放线段树,且根节点区间[1,n] 使用左...
  • update7
  • update7
  • 2017-03-13 20:26:44
  • 1742

hdu 4027(线段树区间开方求和)

本来很早就做了这道题的,但是今天突然发现了. 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4027 解法:首先这道题的数据就告诉我们只能用线段树,但...
  • chen20000804
  • chen20000804
  • 2016-07-27 15:35:02
  • 644

线段树降空间复杂度,从O(4n)降到O(2n)

int ID(int l, int r) { return l + r | l != r; }  通常情况下,我们都是用rt来保存内容,然后左子树就是rt 我们仔细想一想,线段树的节点个数其实...
  • qwb492859377
  • qwb492859377
  • 2016-05-15 00:31:53
  • 1372

BZOJ3211 花神游历各国(线段树,区间开根号)

描述InputOutput 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 1 1 4 Sam...
  • riba2534
  • riba2534
  • 2017-12-01 21:23:03
  • 204

【自用】线段树 区间最小值

参考http://www.cnblogs.com/TenosDoIt/p/3453089.html概述是一种平衡二叉树,在每个节点保存一条线段(一个数组区间),主要用于高效解决连续区间的动态查询,基本...
  • huhaijing
  • huhaijing
  • 2016-01-07 19:41:06
  • 1244

线段树开4N空间证明

线段树采用数组储存时,无疑,其储存空间利用与其左右子树定义有关 方式一: 左子树:[l,l+r2][l,\frac{ l+r}{2}] 右子树:[l+r2+1,r][\frac{ l+r}{2}+1...
  • gl486546
  • gl486546
  • 2017-10-15 19:39:55
  • 207

(线段树) 简单 区间求和

//区间求和 getsum() 函数,与区间最小值不同的是,建树的时候区间最小值数组里面存放的是最小项,而求和是建树数组里面存放的是子树和,还有pushdown()函数传递的时候,val的数值要跟着变...
  • huihui1094667985
  • huihui1094667985
  • 2017-04-19 08:46:21
  • 249

POJ 3468 A Simple Problem with Integers(线段树|区间加减&&区间求和)

题目链接:点击打开链接 题意:区间加减,区间求和。 该题是线段树区间增减和区间求和的模板题。 和区间修改值一样, 在每个结点上维护一个之前加减的值, 那么每次经过一个结点时, 当前结点一定已经拥有...
  • weizhuwyzc000
  • weizhuwyzc000
  • 2016-01-01 21:31:23
  • 1774
收藏助手
不良信息举报
您举报文章:线段树需要开4倍区间大小的数组的原因
举报原因:
原因补充:

(最多只允许输入30个字)