线段树 数据结构详解与模板

本文介绍了线段树这种数据结构,它具有单点修改和区间查询等操作,且复杂度为O(logn)。线段树能覆盖树状数组的所有功能,虽然树状数组在常数和编程复杂度上有优势。线段树实质上是一种二叉树,用于存储区间和,建树和操作主要涉及递归。文章详细讲解了线段树的结构、延迟标记的概念及其在区间修改和查询中的应用,并提供了模板代码。
摘要由CSDN通过智能技术生成

转载请注明出处bestsort.cn线段树是一个查询和修改复杂度都为log(n)的数据结构。主要用于数组的单点修改&&单点查询&&区间求和&&区间修改.

另外一个拥有类似功能的是树状数组但是树状数组最常用的是单点修改&&区间求和.

 

线段树完全涵盖树状数组所有功能

 

具体区别和联系如下:

1.两者在复杂度上同级, 但是树状数组的常数明显优于线段树, 其编程复杂度也远小于线段树.

2.树状数组的作用被线段树完全涵盖, 凡是可以使用树状数组解决的问题, 使用线段树一定可以解决, 但是线段树能够解决的问题树状数组未必能够解决.

 

说了这么多,其实线段树就是个二叉树而已,只不过叶子节点记录的是区间之间的和而已

先给一份样图

其中,矩形内的是区间之和,区间外的是数组下标(线段树用数组存数据).不难看出,线段树的左孩子=根节点下标*2,右孩子=根节点下标*2+1,而左右孩子则是根节点将区间二分的结果.

先给出线段树的结构体定义然后咱们再仔细讲讲各种(sao)操作

struct node {
    int l,r,w,flag;
} a[maxn<<2]; //4倍空间

 


结构体里有个延迟标记的东西,咱们下面再说这个问题

 

 

 

 

需要注意的是如果是n个数,那么线段树需要开4n的空间.理论上是2n-1的空间,但是你递归建立的时候当前节点为r,那么左右孩子分别是2*r,2*r+1,此时编译器并不知道递归已结束,因为你的结束条件是在递归之前的,所以编译器会认为下标访问出错,也就是空间开小了,应该再开大2倍。有时候可能你发现开2,3倍的空间也可以AC,那只是因为测试数据并没有那么大。

至于为什么开4倍,我从网上摘抄了一部分(反正我是看不懂

 

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

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

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

            化简可得

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值