线段树中的懒惰传播2025年03月17日 | 阅读 9 分钟 在上篇文章中,我们介绍了线段树及其范围求和问题的示例。我们使用相同的“指定范围求和”问题解释了懒惰传播。 ![]() 简单的线段树更新函数是如何工作的?在上一节中,update 方法用于仅更改数组中的一个值。由于一个数组元素可能位于多个线段树节点的范围内,因此需要注意,数组中单个值的更新可能会导致线段树中出现多个更新。 本文中的简单推理如下所示。 1) 从线段树的根节点开始。 2) 如果需要修改的数组索引超出了当前节点的范围,则返回。 3) 更新当前节点,如果不是,则对子节点重复此操作。 此处显示了上一篇文章中的代码。 C++ 代码上述策略的应用如下所示: 如果许多数组索引需要更新怎么办?例如,将索引在 2 到 7 之间的每个数组元素增加 10。对于从 2 到 7 的每个索引,必须调用上述更新。通过创建一个名为 updateRange() 的函数来根据需要更新节点,我们可以避免进行多次调用。 C++ 代码上述策略的应用如下所示: 懒惰传播是一种用于加快范围更新速度的优化技术。当存在多个更新且正在对范围执行更新时(避免在更新中进行递归调用),我们可以延迟一些更新,并在需要时才执行这些更新。 请注意,线段树中的一个节点存储或表示多个索引的查询结果。此外,如果更新操作的范围包含该节点,则其所有后代也必须更新。例如,考虑上图中值为 27 的节点。此节点包含索引 3 到 5 之间的值的总和。如果我们的更新查询涵盖范围 2 到 5,我们必须同时更新此节点及其所有后代。 通过将此更新信息存储在称为懒惰节点或值的独立节点中,我们可以仅更新值为 27 的节点,并延迟对其后代的更新。我们创建了一个名为 lazy[] 的数组来代表懒惰节点。lazy[] 的大小与用于表示线段树的代码中的数组相同,即 tree[]。 目标是将 lazy[] 的所有元素设置为 0。如果 lazy[i] 的值为 0,则表示线段树节点 i 上没有待处理的更改。lazy[i] 的非零值表示在对线段树节点 i 进行任何查询之前,必须将此总和添加到该节点。 这是更新后的更新技术。 查询函数是否也已更改?如果查询发送到一个尚未更新的节点,可能会出现问题,因为我们修改了 update 以推迟其活动。因此,我们还需要修改上一篇文章中使用的查询方法 getSumUtil。getSumUtil() 现在在更新节点之前确定是否有待处理的更新。一旦它确认所有待处理的更新都已完成,它的功能就与之前的 getSumUtil() 类似。 下面的程序展示了懒惰传播的工作原理。 C++ 代码上述策略的应用如下所示: 输出 Sum of values in given range = 15 Updated sum of values in given range = 45 时间复杂度:O(n) 辅助空间: O(MAX) 下一主题线段树 - 范围最小值查询 |
使用堆化操作构建堆的时间复杂度取决于我们使用的方法;让我们了解一下我们有哪些方法:构建堆有两种标准方法:朴素方法(插入):在此方法中,我们必须将每个元素插入...
阅读 4 分钟
?堆栈是编程和计算机科学中广泛使用的基本数据结构。元素根据后进先出 (LIFO) 原则添加到堆栈顶部并从堆栈顶部删除。尽管优先级队列或堆可以高效地实现堆栈,但它们……
7 分钟阅读
什么是编码?编码涉及将数据或信息从一种形式、结构或符号转换为另一种形式、结构或符号。这种灵活性通常是必需的,原因包括数据存储、传输和信息处理。编码有多种格式,可根据特定上下文和需求进行定制,并涵盖各种数据...
阅读 6 分钟
问题陈述:给定一个 0 索引的整数数组 nums。存在一个长度为 nums.length 的数组 arr,其中 arr[i] 是所有 j 使得 nums[j] == nums[i] 且 j != i 的 |i - j| 之和。如果不存在这样的 j,则将 arr[i] 设置为...
阅读 12 分钟
二叉树的直径可以定义为连接二叉树中任意两个节点的最长路径之间的边数。二叉树的直径也称为二叉树的宽度。路径表示……
阅读 13 分钟
传统的二叉搜索树存在一些令人不快的限制。介绍 B-Tree,这是一种多功能数据结构,可以轻松处理大量数据。传统的二叉搜索树在存储和搜索大量数据方面可能会变得不可行,因为它们的效率低下...
阅读 4 分钟
引言 在计算机科学和算法的字符串处理中,回文提供了独特的可能性和挑战。回文子字符串是不对称的,这使得传统的字符串处理算法难以在长字符串中有效地识别和管理它们。在这种情况下,...作为一种有用的工具...
7 分钟阅读
引言:在计算机科学和算法设计领域,某些问题因其优雅性和复杂性而脱颖而出。其中一个问题是“大树-列表递归问题”,它促使软件工程师将二叉搜索树(BST)转化为已排序的双向链表(DLL)。这个问题...
阅读 4 分钟
简介 队列是计算机科学和日常应用中广泛使用的数据结构。要交错队列的前半部分和后半部分,请重新组织队列的项,使其前半部分和后半部分交替出现。例如:假设我们有一个队列,最初包含整数 1, 2, 3, 4,...
阅读 8 分钟
排序是按特定顺序组织一组事物或片段。根据特定标准,例如数值、字母顺序或其他比较集,顺序可以在升序和降序之间变化。分类代表了计算机科学中的一项核心操作,可以高效地检索...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India