Python高级数据结构——线段树(Segment Tree)

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Python高级数据结构——线段树(Segment Tree)

Python中的线段树(Segment Tree):高级数据结构解析

线段树是一种专用于处理区间查询的数据结构,在解决范围内的查询和更新操作时具有高效性能。在本文中,我们将深入讲解Python中的线段树,包括线段树的基本概念、构建、查询和更新操作,并使用代码示例演示线段树的使用。

基本概念

1. 线段树的表示

线段树通过递归地将数组分成不同的区间来构建。每个节点代表数组的一个区间,包括该区间的起始和结束索引、区间的和或最大值等信息。

class SegmentTreeNode:
    def __init__(self, start, end):
        self.start = start
        self.end = end
        self.sum = 0  # 区间和
        self.left = None
        self.right = None

class SegmentTree:
    def __init__(self, nums):
        self.root = self._build_tree(nums, 0, len(nums) - 1)

    def _build_tree(self, nums, start, end):
        if start > end:
            return None
        if start == end:
            return SegmentTreeNode(start, end)
        mid = (start + end) // 2
        root = SegmentTreeNode(start, end)
        root.left = self._build_tree(nums, start, mid)
        root.right = self._build_tree(nums, mid + 1, end)
        return root

    # 查询区间和
    def query(self, root, start, end):
        if not root or start > root.end or end < root.start:
            return 0
        if start <= root.start and end >= root.end:
            return root.sum
        mid = (root.start + root.end) // 2
        return self.query(root.left, start, min(mid, end)) + \
               self.query(root.right, max(mid + 1, start), end)

    # 更新节点值
    def update(self, root, index, val):
        if not root:
            return
        if root.start == root.end == index:
            root.sum = val
            return
        mid = (root.start + root.end) // 2
        if index <= mid:
            self.update(root.left, index, val)
        else:
            self.update(root.right, index, val)
        root.sum = root.left.sum + root.right.sum

# 示例
nums = [1, 3, 5, 7, 9, 11]
seg_tree = SegmentTree(nums)
print(seg_tree.query(seg_tree.root, 1, 4))  # 输出: 25
seg_tree.update(seg_tree.root, 2, 6)
print(seg_tree.query(seg_tree.root, 1, 4))  # 输出: 29

应用场景

线段树广泛应用于处理区间查询的场景,例如:

  1. 区间和查询: 查询数组中某个区间的和。
  2. 区间最值查询: 查询数组中某个区间的最大值或最小值。
  3. 离线算法: 在大规模数据中进行区间操作的离线算法。

    代码示例:解决区间和查询问题

# 创建线段树
nums = [1, 3, 5, 7, 9, 11]
seg_tree = SegmentTree(nums)

# 查询区间和
result = seg_tree.query(seg_tree.root, 1, 4)
print(f"区间和: {result}")  # 输出: 区间和: 25

# 更新节点值
seg_tree.update(seg_tree.root, 2, 6)

# 再次查询区间和
result = seg_tree.query(seg_tree.root, 1, 4)
print(f"更新后的区间和: {result}")  # 输出: 更新后的区间和: 29

总结

线段树是一种高效处理区间查询的数据结构,通过构建树形结构,能够在对数时间内完成查询和更新操作。在Python中,我们可以利用类似上述示例的代码实现线段树,并根据实际问题定制查询和更新的操作。理解线段树的基本概念、构建方式和应用场景,将有助于更好地应用线段树解决实际问题,提高算法的效率。在实际应用中,线段树常被用于解决区间操作问题,如区间和查询、区间最值查询等。

目录
相关文章
|
1月前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
36 0
|
1月前
|
Python
Python 中常见的数据结构(二)
Python 中常见的数据结构(二)
|
1月前
|
存储 索引 Python
Python 中常见的数据结构(一)
Python 中常见的数据结构(一)
|
1月前
|
开发者 Python
Python 常用的数据结构
Python 常用的数据结构
|
1月前
|
存储 索引 Python
python数据结构之列表详解
列表是Python中极为灵活和强大的数据结构,适合于存储和操作有序数据集合。掌握其基本操作和高级特性对于编写高效、清晰的Python代码至关重要。通过本回答,希望能帮助你全面理解Python列表的使用方法,从而在实际编程中更加游刃有余。
20 0
|
1月前
|
存储 Python
Python 中常见的数据结构(三)
Python 中常见的数据结构(三)
|
1月前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
在数据结构的广袤领域中,图是一种强大而复杂的结构,而深度优先搜索(DFS)和广度优先搜索(BFS)则是遍历图的两把利剑。Python 以其简洁和强大的特性,为我们提供了实现和运用这两种算法的便捷途径。
70 0
|
1月前
|
程序员 Python 容器
python 中的 collections 模块:常用数据结构和工具详解
python 中的 collections 模块:常用数据结构和工具详解
13 0
|
2月前
|
存储 数据安全/隐私保护 Python
Python常用数据结构—字典
Python常用数据结构—字典
|
2月前
|
存储 索引 Python
Python编程的常用数据结构—列表
Python编程的常用数据结构—列表