关于线段树开4倍空间的探讨

声明:

  1. 线段树维护的区间范围也是[1,x],根节点从1开始(1,2,3…)
  2. 建树过程参数记录当前节点rt,同时记录当前节点所对应的区间[l,r],而不是用一个结构体维护。
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

void build(int l,int r,int rt){  //建树过程(参见网上大部分线段树模板)
	if(l==r){
		scanf("%d",&tree[rt]);
		return;
	}
	int m=(l+r)>>1;
	build(lson);build(rson);
	pushUp(rt); // 向上更新
}

问题1: 线段树空间只需要2*n即可???

  • 对于这种建图方式,建出来的并不是完全二叉树,而是具有完全二叉树性质(父节点为x,则左儿子为2x,右儿子为2x+1),好处:可以省掉许多并不需要的节点。由于具有完全二叉树这种性质,2*n空间一定不够用!!见下图:
    在这里插入图片描述

问题2: 线段树空间只需要3*n即可???

证明: 设长度为N的数组在线段树中,编号最靠右的节点为F(N)。(上图长度n=6,编号最右节点为13)
在这里插入图片描述
代码测试:

  • 思路:通过观察在建树过程中,最大的节点来判断是否会3*n空间越界。
  • 结果:通过发现,存在许多的3n空间的越界,最小的n=36,平时我们手动画一画,看是否3n越界,可能只是画的n比较小,所以画一画n=36,你将发现3*n会越界!!!

初学线段树,如有错误,还望指出,多谢多谢~

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值