线段树 - 范围最小值查询17 Mar 2025 | 5 分钟阅读 在上篇文章中,我们通过一个简单的例子介绍了线段树。本文将介绍线段树的另一个应用,即区间最值查询问题。我们要解决的问题如下: 我们有一个数组 arr[0, 1, n]。其中 0 = qs = qe = n-1,我们应该能够高效地找出索引 qs(查询开始)到 qe(查询结束)之间的最小值,其中 0 <= qs <= qe <= n-1。 通过遍历 qs 到 qe 的循环来找出给定范围内的最小元素是一个简单的解决方案。在最坏的情况下,这种解决方案需要 O(n) 的时间。 另一种方法是创建一个二维数组,其中条目 I j] 保存范围 arr[i..j] 中的最小值。预处理需要 O(n2) 的时间,但现在可以在 O(1) 时间内找出给定范围的最小值。此外,此方法需要 O(n2) 的额外空间,这对于大型输入数组来说可能非常昂贵。 使用线段树可以快速地进行查询和预处理。使用线段树进行预处理的时间复杂度为 O(n),而区间最值查询的时间复杂度为 O(Logn)。线段树所需的额外存储空间为 O(n)。 线段树表示
线段树显示为树的数组表示。索引为 I 的每个节点的左子节点位于索引 2*i+1,右子节点位于索引 2*i+2,父节点位于索引( I - 1) / 2。 ![]() 从数组构建线段树我们首先检查线段 arr[0,... n-1]。当前线段每次都被分成两半(假设它还没有变成长度为 1 的线段),然后对两个半部分执行相同的操作,并将每个线段的最小值存储在线段树节点中。 除了最后一层,创建的线段树的每一层都将是完全填充的。此外,由于我们在每一层都始终将线段分成两半,因此该树将是一个满二叉树。由于创建的树总是带有 n 个叶子节点的满二叉树,因此将有 n-1 个内部节点。因此,总共有 2*n - 1 个节点。 线段树的高度将为 log2n。考虑到树是使用数组表示的,并且必须保留父子索引之间的关系,因此将为线段树分配 2 * 2 log2n - 1 的内存。 找出指定范围的最小值。一旦构建了线段树,如何使用它进行区间最值查询。查找最小值的算法如下。 C++ 代码上述策略的应用如下所示: 输出 Minimum of values in range [1, 5] is = 2
下一个主题线段树 - 指定范围的和 |
N元树概述 N元树是一种树状数据结构,它允许每个节点最多有 N 个子节点。N元树比二叉树(最多只能有两个子节点)提供了一种更灵活的数据组织方式...
阅读 4 分钟
搜索问题自动完成,也称为自动建议或查看想法,是通常在网络搜索引擎和站点中找到的一个功能,它有助于用户形成他们的搜索问题。当用户开始在搜索栏中输入时,系统会预测并显示……
7 分钟阅读
传统上,要查找数组中的最大元素,我们使用一个循环来迭代所有元素并返回该值。伪代码实现如下。伪代码 // 查找给定数组中的最大元素。 // arr:我们想要查找的数组...
阅读 12 分钟
引言 图的若干问题涉及路径操作以满足给定的规范。例如,重新排序有向图中的路径,如城市零控制所有路径。交通管理和网络路由等实际应用已在本书中说明。本文将...
阅读9分钟
链表是计算机科学和编程面试中的基本数据结构。它们提供了存储和访问顺序数据的有效方法。链表的一个关键挑战是有效地对其元素进行排序。与数组不同,链表仅提供对节点的顺序访问。我们无法...
7 分钟阅读
引言 任何城市或地区都需要高效的交通基础设施才能顺利运行。公交和火车总站对于实现人流和货物流至关重要。确定处理预期交通量所需的最低平台数量,同时减少拥堵和延误,是其中一个关键问题...
阅读 4 分钟
中国邮递员问题或路线检查问题是一种欧拉回路问题,它在不重复访问每条边的情况下找到无向图中最短的闭合路径。这个问题在邮递员需要……
7 分钟阅读
二叉树是计算机科学中必不可少的数据结构,它提供了一种组织和管理数据的有序方法。另一方面,循环双向链表 (CDLL) 具有循环结构,其中每个节点指向其前一个节点和下一个节点。转换一个...
5 分钟阅读
引言:在数据结构领域,树在组织和表示层级关系方面起着至关重要的作用。树结构中经常出现的一个有趣问题是连接同一级别的节点。此任务涉及在树中链接共享公共父节点的节点,...
阅读 6 分钟
围绕给定值对链表进行分区,以及如果我们不关心使链表元素“稳定”的话。引言链表是计算机科学中的基本数据结构,因为它们提供了有效的插入和删除操作以及动态内存分配。编程中的常见障碍...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India