上一篇
在算法和数据结构的世界中,线段树是一种非常强大的工具,特别适用于处理区间查询和区间更新问题。本文将用通俗易懂的方式,手把手教你如何用Python实现一个基础但功能完整的线段树。
线段树是一种二叉树结构,每个节点代表一个区间。它能够高效地支持以下操作:
Python 语法简洁,逻辑清晰,非常适合教学和快速原型开发。通过学习 Python线段树 的实现,你不仅能掌握这一重要数据结构教程的核心思想,还能为后续学习更复杂的算法打下坚实基础。
我们通常用数组来模拟线段树(完全二叉树),其中:
下面是一个支持区间求和和单点更新的线段树实现:
class SegmentTree: def __init__(self, data): self.n = len(data) self.tree = [0] * (4 * self.n) # 通常开4倍空间 self.data = data[:] self._build(1, 0, self.n - 1) def _build(self, node, start, end): if start == end: self.tree[node] = self.data[start] else: mid = (start + end) // 2 left_child = 2 * node right_child = 2 * node + 1 self._build(left_child, start, mid) self._build(right_child, mid + 1, end) self.tree[node] = self.tree[left_child] + self.tree[right_child] def update(self, index, value): self._update(1, 0, self.n - 1, index, value) def _update(self, node, start, end, idx, val): if start == end: self.data[idx] = val self.tree[node] = val else: mid = (start + end) // 2 if idx <= mid: self._update(2 * node, start, mid, idx, val) else: self._update(2 * node + 1, mid + 1, end, idx, val) self.tree[node] = self.tree[2 * node] + self.tree[2 * node + 1] def query(self, left, right): return self._query(1, 0, self.n - 1, left, right) def _query(self, node, start, end, l, r): if r < start or end < l: return 0 # 超出查询范围 if l <= start and end <= r: return self.tree[node] # 完全包含 mid = (start + end) // 2 left_sum = self._query(2 * node, start, mid, l, r) right_sum = self._query(2 * node + 1, mid + 1, end, l, r) return left_sum + right_sum 下面是一个简单的使用示例:
# 初始化数据arr = [1, 3, 5, 7, 9, 11]# 构建线段树seg_tree = SegmentTree(arr)# 查询区间 [1, 3] 的和(即 3+5+7 = 15)print(seg_tree.query(1, 3)) # 输出: 15# 更新索引 2 的值为 10seg_tree.update(2, 10)# 再次查询 [1, 3] 的和(即 3+10+7 = 20)print(seg_tree.query(1, 3)) # 输出: 20 - Python线段树 使用递归构建,时间复杂度为 O(n)
- 单点更新和区间查询的时间复杂度均为 O(log n)
- 线段树的空间复杂度为 O(n),通常分配 4 倍原数组大小
- 这种结构非常适合解决动态区间查询问题,是竞赛和面试中的高频考点
当你掌握了基础线段树后,可以尝试:
希望这篇 数据结构教程 能帮助你轻松入门线段树!动手敲一遍代码,你会对它的原理有更深的理解。
本文由主机测评网于2025-12-13发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025127341.html