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

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

使用细分树查询给定索引范围内的值在A到B范围内的元素

什么是细分树?

细分树是一种把一段数列细分成很多子区间的数据结构。其主要作用是为了对原问题的划分与处理。

细分树的构建过程

细分树是一种基于分治的思想。对于一个长度为 N 的数列,我们将其等分成两个长度为 N/2 的子数列,然后再对这两个子数列进行递归细分,直到每个子数列长度为 1,此时细分树的叶子节点就是数列中的每个元素。

细分树的查询过程

给定一个查询区间 (A, B),我们可以通过递归遍历细分树,对相应的节点判断它代表的区间是否能够与查询区间 (A, B) 有交集,如果有交集,则继续向下递归,否则直接返回 0。如果细分树的叶子节点对应的区间范围被查询区间覆盖,则可以直接返回其代表的数值。

代码示例

使用 Python 实现细分树查询:

class SegTree:
    def __init__(self, nums: List[int]):
        self.nums = nums
        self.length = len(nums)
        self.tree = [0] * (4*self.length)
        self.build(1, 0, self.length-1)

    def build(self, node: int, start: int, end: int):
        if start == end:
            self.tree[node] = self.nums[start]
        else:
            mid = (start + end) // 2
            left = node << 1
            right = left + 1
            self.build(left, start, mid)
            self.build(right, mid+1, end)
            self.tree[node] = self.tree[left] + self.tree[right]

    def query(self, node: int, start: int, end: int, left: int, right: int) -> int:
        if start > right or end < left:
            return 0
        elif start >= left and end <= right:
            return self.tree[node]
        else:
            mid = (start + end) // 2
            left_node = node << 1
            right_node = left_node + 1
            left_sum = self.query(left_node, start, mid, left, right)
            right_sum = self.query(right_node, mid+1, end, left, right)
            return left_sum + right_sum
调用示例

假设我们有以下数据:

nums = [1, 3, 5, 7, 9, 11, 13, 15, 17]

我们可以通过构建细分树,查询在第 2 到第 6 个元素之间,并且在 3 到 9 之间的元素和:

tree = SegTree(nums)
result = tree.query(1, 0, tree.length-1, 2, 6)
result = tree.query(1, 0, tree.length-1, 3, 9)
print(result)

输出结果为:

27
58