📅  最后修改于: 2023-12-03 15:06:51.029000             🧑  作者: Mango
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 的基本原理,并在实际应用中发挥作用。