「|「 学习笔记 」线段树合并
线段树合并
普通线段树 \((\) 无懒惰标记 \()\)
时间复杂度 & 空间复杂度
假设有 \(2\) 棵线段树,它们的结点个数之和为 \(s\),那么建树 时间复杂度 是 \(O(s)\) 的。
【「|「 学习笔记 」线段树合并】为了简单表达,第 \(i\) 棵线段树用 \(\{ i \}\) 表示。
考虑 ${ x } $ 和 \(\{ y \}\) 的合并:\((\) 以下的结点指表示区间相同的结点,例如根结点都表示 \(\mathrm{down} \sim \mathrm{up}\) \()\)
- 情况 \(1\) \(\{ x \}\) 和 \(\{ y \}\) 都存在的结点:
- 这 \(2\) 个结点合并可以视作给其中 \(1\) 个结点 \(+1\);
- 因此 时间复杂度 为 \(+1\) 的次数;在这个情况下,每个结点至多执行 \(1\) 次 \(+1\) 操作,至多有 \(s\) 个结点,所以 时间复杂度 的上届是 \(O(1 \times s) = O(s)\)。
- 情况 \(2\) \(\{ x \}\) 和 \(\{ y \}\) 中至少有一个不存在的结点:
- 此时它们的父亲结点一定都是存在的,不然就不会递归到这里了,同时也不需要往下递归了,对 时间复杂度 的贡献可以视作给父亲结点 \(+1\);
- 在这个情况下,一个父亲结点至多执行 \(2\) 次 \(+1\) 操作,至多有 \(s\) 个父亲结点,所以 时间复杂度 的上届是 \(O(2 \times s) = O(2s)\)。
这个结点可以推广到多棵线段树合并:记它们的结点个数之和为 \(S\),那么线段树合并的时间复杂度为 \(O(S)\),空间复杂度也为 \(O(S)\)。
推荐阅读
- Jupyter|Jupyter + Miniconda + VsCode 学习利器
- 联邦学习(按混合分布划分Non-IID样本)
- 初学者福利(分享五个免费的 Python 学习网站,抓紧收藏吧)
- 让我们一起来学习一下什么是javascript的闭包
- Python机器学习应用之支持向量机的分类预测篇
- 笔记|面向对象笔记
- 学习经历|cgb2107-第三阶段-day03-Mybatis入门
- 图解机器学习|图解机器学习 | 支持向量机模型详解
- 图数据库笔记(NebulaGraph的基础查询)
- 图解机器学习|图解机器学习 | LightGBM模型详解