线段树知识整理 | 您所在的位置:网站首页 › 线段树算法时间复杂度 › 线段树知识整理 |
目录
一:什么是线段树?二:线段树的基本结构及空间复杂度线段树的空间复杂度:
三:线段树的常用操作线段树的建树常用函数:1.pushup() 更新操作(子->父)2.pushdown() 更新操作(父->子)3.build() 建树操作3.modify() 修改操作4.query() 查询操作
一:什么是线段树?
线段树的概念: 线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。 线段树可以在 O ( l o g N ) O(logN) O(logN) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。 二:线段树的基本结构及空间复杂度线段树的结构(文字解释): 线段树将每个长度不为 1 1 1 的区间划分成左右两个区间递归求解,把整个线段划分为一个树形结构,线段树的操作通过合并左右两区间信息来求得该区间的信息。这种数据结构可以方便的进行大部分的区间操作。线段树为满二叉树,用一维数组存整颗树线段树的结构(下图所示): 对于线段树最少要开4倍空间的解释: 若最后一层节点都满,则该层为最后一层,有 N N N个节点,则其上面节点数为 N / 2 + N / 4 + N / 8 + . . . . . . + 1 N/2 + N/4 + N/8 + ...... + 1 N/2+N/4+N/8+......+1,此时所有节点数为 N + N / 2 + N / 4 + N / 8 + . . . . . . + 1 N + N/2 + N/4 + N/8 + ...... + 1 N+N/2+N/4+N/8+......+1 和为 2 N − 1 2N - 1 2N−1若最后一层不满,即、上两图所示的情况,则倒数第二层为 N 个节点 N个节点 N个节点,除倒数第一层以外的所有层节点和为 2 N − 1 2N - 1 2N−1,最后一层为 2 N 2N 2N 个节点,即、总节点为 4 N − 1 4N - 1 4N−1 ,所以保险起见,线段树一律开 4 N 4N 4N 空间 三:线段树的常用操作 线段树的建树线段树的节点关系: 若该节点为 x其父节点为 x / 2等效于x >> 1左儿子为 x * 2等效于x 子)**俗称:**懒标记(支持区间修改) 以区间加为例: 含义: 给当前区间的所有儿子加上 add(懒标记) 如图: 建立线段树: 从根节点开始,一层层递归到叶子节点每递归一层调用一次 p u s h u p ( ) ( 由子节点更新父节点 ) pushup()(由子节点更新父节点) pushup()(由子节点更新父节点)一般模板为: 函数参数为:当前区间的编号u 当前区间的左端点l 当前区间的右端点r void build(int u, int l, int r) { tr[u] = {l, r}; if(l == r) return; int mid = l + r >> 1; build(u |
CopyRight 2018-2019 实验室设备网 版权所有 |