线段树 4n 开四倍空间的原因
线段树 4n
一、为何要使用线段树?
对于某一类问题,我们主要关注的是一个线段或者区间。对于给定区间,更新区间中一个元素或者一个区间的值,查询一个区间[i,j]的最大值、最小值,或者区间数字和。
线段树不一定满二叉树,也不一定是完全二叉树,但一定是平衡二叉树,下面是线段树元素个数n=2^k的情况,是满二叉树。
下面是线段树元素个数n!=2^k的情况,不是满二叉树,如下:
由于线段树是平衡二叉树,那么可以使用数组来表示:*把线段树想像成满二叉树(即使是上面这种情况,也想象成满二叉树)*。
满二叉树有下面的性质,想象成满二叉树后,我们可以利用这些性质。对于高度为h层的满二叉树有2h-1个元素,第h层有2(h-1)个元素,h从0~h-1,最后一层的结点数大致相当于前面所有层结点之和,大致相当于整体的一半。
思考:如果区间中共有n个元素,使用数组存储,需要多大的存储空间呢?
如果区间元素个数n=2^k,则构成的线段树为满二叉树,否则则不是,为了使用满二叉树的性质,可以把线段树构造成满二叉树,对于最后一层不存在的叶子结点也要构造出来,思考用多大的数组存储?
(1)区间元素个数n=2k,则满二叉树的最后一层全部是有效元素,而不是靠添加虚值才构成满二叉树。由满二叉树的性质可知,第k层有2k个元素(k从0开始计算),则共有k+1层,总的元素2(k+1)-1个。为了使用的更放心,多给一个空间,也就是2(k+1)-1+1个元素,即2^(k+1)=2n个元素。如下图的红框中的部分。
(2)区间元素个数n!=2k时,假设只多出一个元素,即n=2k+1,就需要多一层来存储,而且最后一层除了剩余的一个真实元素,其它都是虚值。原来需要k+1层,现在需要k+2层,新增的一层可以存储2^(k+1)个元素,即2n,加上之前层的2n,共4n。
所以不考虑添加元素,使用4n的静态空间就可以对付所有情况。