线段树 - 给定范围的求和2025年3月17日 | 阅读 7 分钟 让我们考虑以下问题来理解线段树。 我们有一个数组 arr[0... n-1]。我们应该能够:
使用嵌套循环计算范围和从 l 到 r 循环并计算给定范围内元素的和是一个直接的解决方案。只需输入 arr[i] = x 即可更改值。虽然第一个操作需要 O(n) 时间,但第二个操作只需要 O(1) 时间。 使用前缀和计算范围总和另一种方法是创建一个新数组,并将从开头到 i 的总和存储在第 i 个索引处。现在更新操作需要 O(n) 时间,而给定范围的总和可以在 O(1) 时间内计算出来。如果查询操作很多而更新很少,这种方法效果很好。 使用线段树计算范围总和最有效的方法是使用线段树;我们可以使用线段树在 O(log(N)) 时间内完成这两个操作。 线段树表示
![]() 从给定数组构建线段树我们首先检查段 arr[0,... n-1]。每次我们将当前段分成两半(假设它还没有成为长度为 1 的段),对两半执行相同的操作,然后将每个此类段的结果存储在适当的节点中。 除了最后一层,创建的线段树的每一层都将完全填充。此外,由于我们总是将每个段在每一层分成两部分,因此该树将是一个完全二叉树。由于创建的树始终是一个具有 n 个叶子的完全二叉树,因此总会有 n-1 个内部节点。因此,总共有 2*n - 1 个节点。 给定数组的线段树有多高?线段树的高度将为 log2N。由于树必须使用数组表示,并且必须保留父节点和子节点索引之间的关系,因此为线段树分配的内存量将为 (2 * 2log2n-1)。 搜索范围之和线段树构建完成后如何计算和。计算元素和的算法如下: 在上述实现中,我们需要解决三种情况。
更新值更新可以像树构建和查询操作一样递归地执行。已向我们提供了过时的索引。令 diff 表示新值。从线段树的根开始,我们将 diff 添加到其范围内包含指定索引的每个节点。如果节点不包含指定索引在其范围内,我们不修改它。 C++ 代码上述策略的应用如下所示: 输出 Sum of values in given range = 15 Updated sum of values in given range = 22
下一主题2-3 树(搜索、插入和删除) |
引言 每个投资者在交易股票时都希望获得最大的利润。虽然一些投资者选择长期持有股票,但另一些投资者则希望从暂时的价格波动中获利以最大化他们的收益。为了最大化利润,我们将考察一个...
5 分钟阅读
中国邮递员问题或路线检查问题是一种欧拉回路问题,它在不重复访问每条边的情况下找到无向图中最短的闭合路径。这个问题在邮递员需要……
7 分钟阅读
简介 涉及从字符串中删除相邻重复项的编程问题很常见,C 语言为实现有效的解决方案提供了很好的框架。本文将讨论我们将使用 C 编程语言删除所有相邻重复项的几种方法...
阅读 8 分钟
给定二叉树,找出所有根到叶子路径中不同的节点的最大数量。示例输入:1 / \ 2...
阅读 2 分钟
线性搜索和二分搜索都是用于搜索元素的搜索方法。我们已将数组和键值都提供了这两种方法;我们所需要做的就是在数组中搜索该键。我们将返回对应于该键的索引值...
阅读 17 分钟
设计一种支持常量时间插入、删除、搜索和 getRandom 的数据结构 设计一种允许常量时间插入、删除、搜索和随机访问的数据结构是一个有趣的计算机科学问题。获得这些活动的一致时间复杂度有时需要权衡...
5 分钟阅读
简介:优先级队列是计算机科学中的基本数据结构,可以快速访问优先级最高(或最低)的元素。C++ 中的优先级队列可以扩展以处理对,提供了一种根据对的第一个或第二个元素进行排序的灵活方法...
7 分钟阅读
最低有效数字 我们知道,每个数字都可以表示为数字的形式,并且数字格式可以是任何形式,如二进制、十进制、十六进制、八进制等。如果我们以比特的形式表示数字,那么最左边的数字称为最高有效...
阅读 4 分钟
引言 栈是软件工程和计算机科学中的基本数据结构。根据后进先出 (LIFO) 原则,栈是一个线性数据结构,最后添加到栈中的元素是第一个被移除的。尽管压栈...
阅读 4 分钟
假设我们提供了一个树节点,主要任务是找出给定二叉树节点的父节点。为了做到这一点,我们需要遍历整个树并定位给定节点的父节点...
阅读 10 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India