线段树
线段树(Segment Tree)是一种二叉树数据结构,主要用于高效处理区间查询和更新操作。它常用于解决涉及数组区间的问题,如区间求和、区间最小值/最大值、区间更新等。
核心思想
线段树将数组划分为多个区间,每个节点代表一个区间,叶子节点代表单个元素,非叶子节点代表其子节点区间的合并。通过这种结构,线段树可以在对数时间内完成区间查询和更新。
主要操作
构建(Build):
- 递归地将数组划分为子区间,直到每个区间只包含一个元素。
- 每个节点存储其代表区间的信息(如和、最小值等)。
查询(Query):
- 给定一个区间
[L, R]
,递归地查询与[L, R]
有交集的节点。 - 合并查询结果,返回所需信息。
- 给定一个区间
更新(Update):
- 更新某个元素的值,递归地更新包含该元素的所有区间节点。
- 确保所有相关节点的信息同步更新。
示例
假设有一个数组 [1, 3, 5, 7, 9, 11]
,构建线段树后:
- 根节点代表整个数组
[0, 5]
。 - 左子节点代表
[0, 2]
,右子节点代表[3, 5]
。 - 叶子节点分别代表单个元素
[0]
,[1]
,[2]
,[3]
,[4]
,[5]
。
代码示例(Python)
1 | class SegmentTree: |
总结
线段树通过将数组划分为多个区间,并在每个节点存储区间信息,实现了高效的区间查询和更新操作。它在处理区间相关问题时非常有用,尤其适合需要频繁查询和更新的场景。
以下是使用C++实现的线段树示例代码,支持区间求和、单点更新和区间查询操作:
C++ 线段树示例代码
1 |
|
代码说明
线段树结构:
- 使用数组
tree
存储线段树节点。 - 每个节点存储一个区间的信息(如区间和)。
- 使用数组
**构建函数 (
build
)**:- 递归地将原始数组划分为子区间,构建线段树。
**查询函数 (
query
)**:- 递归地查询与目标区间
[l, r]
有交集的节点,并返回区间和。
- 递归地查询与目标区间
**更新函数 (
update
)**:- 递归地更新目标叶子节点,并同步更新其父节点的值。
接口函数:
queryRange(l, r)
:查询区间[l, r]
的和。updatePoint(idx, value)
:更新索引idx
处的值为value
。
示例输出
1 | Sum of range [1, 4]: 24 |
总结
这个C++实现的线段树支持区间求和、单点更新和区间查询操作,适用于需要高效处理区间问题的场景。通过递归构建和查询,线段树能够在 (O(\log n)) 时间内完成操作。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ZaynusX的博客!