线段树 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的静态空间就可以对付所有情况。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值