📌  相关文章
📜  使用 Segment Tree 在给定索引范围内查询值在 A 到 B 范围内的元素(1)

📅  最后修改于: 2023-12-03 15:06:51.029000             🧑  作者: Mango

使用 Segment Tree 在给定索引范围内查询值在 A 到 B 范围内的元素

简介

Segment Tree(线段树)是一种数据结构,用于进行区间查询操作。它被广泛应用于各种领域,如数学、统计和计算机科学等。本文将介绍如何利用 Segment Tree 在给定索引范围内查询数值在 A 到 B 范围内的元素。

原理

Segment Tree 将一个区间划分为较小的子区间,并将这些子区间保存在树结构中。树的根节点代表整个区间,每个节点代表一个子区间,每个节点包含的元素是子区间内的元素的某种统计信息(如和、最大值等)。

查询时,从树的根节点开始,逐级深入左右子树,并对每个子树进行判断。若子树完全在查询区间内,则返回该子树代表区间的相关信息。若子树只部分在查询区间内,则分别递归进入左右子树继续查询。

代码实现

下面是一段 Python 代码,用于实现查询操作。

class SegmentTree:
    def __init__(self, nums):
        self.n = len(nums)
        self.tree = [0] * (2 * self.n)
        self.build(nums)

    def build(self, nums):
        for i in range(self.n):
            self.tree[self.n + i] = nums[i]
        for i in range(self.n - 1, 0, -1):
            self.tree[i] = self.tree[i * 2] + self.tree[i * 2 + 1]

    def query(self, left, right, A, B, i=1):
        if right < A or left > B:
            return 0
        if A <= left and B >= right:
            return self.tree[i]
        mid = (left + right) // 2
        return self.query(left, mid, A, B, i * 2) + self.query(mid + 1, right, A, B, i * 2 + 1)

这段代码定义了一个 SegmentTree 类,并包含了建树和查询操作。在建树时,首先将给定的 nums 数组保存到树的叶子节点中,然后依次计算每个节点代表区间的值。在查询操作中,通过递归调用,在树上查找与查询区间相交的节点,并累加统计信息。如果查询区间完全包含了当前节点,则直接返回该节点的值。

示例

假设有一个数组 [1, 3, 5, 7, 9, 11],我们需要查询其中元素值在 2 到 6 之间的所有元素的和,即 $3 + 5 + 7 + 9 = 24$。

下面是如何使用 SegmentTree 类实现这个查询的 Python 代码:

nums = [1, 3, 5, 7, 9, 11]
st = SegmentTree(nums)
print(st.query(0, len(nums) - 1, 2, 6))

输出:

24
总结

Segment Tree 是一种高效的数据结构,用于解决区间查询问题。在本文中,我们介绍了如何利用 Segment Tree 在给定索引范围内查询数值在 A 到 B 范围内的元素。希望这篇文章能够帮助你理解 Segment Tree 的基本原理,并在实际应用中发挥作用。