线段树总结

线段树的定义

线段树(Segment Tree)是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。使用线段树可以快速地查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。

线段树是一种非常有用的数据结构,其基本思想是通过二分的方式将一个大的区间平均地划分成两个小区间,然后再将每个小区间继续平均划分,直到每个区间只包含一个节点的信息。因此,线段树是一种平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。

它的主要作用包括:

  • 快速查询:线段树可以高效地查询某个区间内的信息,例如区间和、区间最大值、区间最小值等。通过利用二分查找的思想,线段树可以在O(logN)的时间复杂度内完成这些查询操作。
  • 区间修改:除了查询操作外,线段树还可以支持区间修改操作。例如,可以将某个区间内的所有元素都加上一个常数,或者将某个区间内的所有元素都乘以一个常数等。这些操作也可以在O(logN)的时间复杂度内完成。
  • 动态维护区间信息:线段树可以动态地维护区间信息,即当区间内的元素发生变化时,线段树可以自动地更新相应的区间信息。这种特性使得线段树在处理动态数据方面非常有用。

需要注意的是,虽然线段树的时间复杂度较低,但是它的空间复杂度较高,因此在实际应用时需要权衡时间和空间的因素来选择合适的数据结构。

图示讲解

区间计算

一般通过数组来实现线段树的存储。树的根节点存储在a[0]。

对于任意节点下标i ,都有:

 

代码实现(示例)

线段树的数据插入

//线段树的数据插入,使用a来存储线段树中的数据
//变量pos对应正在访问的数组下标
//r,l表示当前正在处理的区间的左右端点。
//num为待插入数字
void Tree_insert(vector<int>& a, int pos, int l, int r, int num) {a[pos]++;if (num == r && num == l)return;int mid = (l + r) / 2;//计算区间中点int l_ch = pos * 2 + 1;int r_ch = pos * 2 + 2;if (num <= mid)Tree_insert(a, l_ch, l, mid, num);else Tree_insert(a, r_ch, mid + 1, r, num);
}

线段树的查找

int Tree_search(vector<int>& a, int pos, int l, int r, int num) {if (num == r && num == l)return a[pos];int mid = (l + r) / 2;//计算区间中点int l_ch = pos * 2 + 1;int r_ch = pos * 2 + 2;if (num <= mid)return Tree_search(a, l_ch, l, mid, num);else return Tree_search(a, r_ch, mid + 1, r, num);
}

线段树的打印

void print_Tree(vector<int>& a, int pos, int l, int r) {printf("[%d %d]a[%d]=%d\n", l, r, pos, a[pos]);if (l == r)return;int mid = (l + r) / 2;//计算区间中点int l_ch = pos * 2 + 1;int r_ch = pos * 2 + 2;print_Tree(a, pos*2+1, l, mid);print_Tree(a, pos*2+2, mid + 1, r);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470027.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录 Leetcode406. 根据身高重建队列

题目&#xff1a; 代码(首刷看解析 2024年2月15日&#xff09;&#xff1a; class Solution { static bool cmp(const vector<int>& A, const vector<int>& B) {if(A[0] B[0]) return A[1] < B[1];return A[0] > B[0]; } public:vector<vector&…

HTML5+CSS3+JS小实例:锥形渐变彩虹按钮

实例:锥形渐变彩虹按钮 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /…

(01)Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

pytorch tensor维度变换

目录 1. view/reshape2. squeeze/unsqueeze3. expand 扩展4. repeat5 .t转置6. transpose7. permute 1. view/reshape view(*shape) → Tensor 作用&#xff1a;类似于reshape&#xff0c;将tensor转换为指定的shape&#xff0c;原始的data不改变。返回的tensor与原始的tensor…

P1010 [NOIP1998 普及组] 幂次方题解

题目 任何一个正整数都可以用2的幂次方表示。例如137。 同时约定次方用括号来表示&#xff0c;即ab可表示为a(b)。 由此可知&#xff0c;137可表示为2(7)2(3)2(0)&#xff0c;进一步&#xff1a;72 ( 用2表示)&#xff0c;并且32。 所以137可表示为2(2(2)22(0))2(22(0))2(0…

算法沉淀——队列+宽度优先搜索(BFS)(leetcode真题剖析)

算法沉淀——队列宽度优先搜索&#xff08;BFS&#xff09; 01.N 叉树的层序遍历02.二叉树的锯齿形层序遍历03.二叉树最大宽度04.在每个树行中找最大值 队列 宽度优先搜索算法&#xff08;Queue BFS&#xff09;是一种常用于图的遍历的算法&#xff0c;特别适用于求解最短路径…

【AI视野·今日CV 计算机视觉论文速览 第298期】Fri, 26 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 26 Jan 2024 Totally 71 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities Authors Yiyuan Zhang, Xiaohan …

学习笔记19:牛客寒假训练营(DFHJK)

D 数组长度为2*1e5 ,我们知道如果超过30个非&#xff08;-1&#xff0c;1&#xff09;的数字相乘一定是大于查询的值域的 所以如果超过60&#xff08;30*2&#xff09;个数字&#xff0c;那么一定不能构成查询的数&#xff0c;而如果小于60个则可以暴力预处理一下&#xff0c…

OpenSource - 一站式自动化运维及自动化部署平台

文章目录 orion-ops 是什么重构特性快速开始技术栈功能预览添砖加瓦License orion-ops 是什么 orion-ops 一站式自动化运维及自动化部署平台, 使用多环境的概念, 提供了机器管理、机器监控报警、Web终端、WebSftp、机器批量执行、机器批量上传、在线查看日志、定时调度任务、应…

php基础学习之函数

基本概念 是一种语法结构&#xff0c;将实现某一个功能的代码块封装到一个结构中&#xff0c;从而实现代码的重复利用 php函数的定义语法 &#xff08;与C/Java很类似&#xff0c;区别在于没有数据类型&#xff0c;因为php是弱类型语言&#xff09; function 函数名(参数){ //…

代码随想录算法训练营第50天 | 70.爬楼梯(进阶) + 322.零钱兑换 + 279.完全平方数

今日任务 70. 爬楼梯 &#xff08;进阶&#xff09; 322. 零钱兑换 279.完全平方数 70.爬楼梯(进阶) - Easy 题目链接&#xff1a;题目页面 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路&a…

软件风险分类整理

软件项目风险分类整理 1.需求分析 2.软件设计 3.编码和单元测试 4.集成和测试 5.验收和维护 6.团队管理 7.成本管理 8.组织管理