区间信息维护与查询【线段树 】 - 原理1 线段树的基本操作

news2025/1/17 0:22:07

区间信息维护与查询【线段树 】 - 原理1 线段树的基本操作

线段树(segment tree)是一种基于分治思想的二叉树,它的每个节点都对应一个[L , R ]区间,叶子节点对应的区间L =R 。每一个非叶子节点[L , R ]其左子节点的区间都为[L , (L +R )/2],右子节点的区间都为[(L +R )/2+1, R ]。

[1, 10]区间的线段树如下图所示:

在这里插入图片描述

因为线段树对区间进行二分,是一棵平衡二叉树,所以树高为O(logn ),树上的操作大多与树高相关。

线段树主要用于更新和查询,一般至少有一个是区间更新或查询。更新和查询的种类变化多样,灵活运用线段树可以解决多种问题。

【1】 线段树的存储方式

对于区间最值(最大值或最小值)查询问题,线段树的每个节点都包含三个域:l、r、 mx,其中l 和r 分别表示区间的左右端点,mx表示[l , r ]区间的最值。

本题以最大值为例,若有10个元素a [1…10]={5, 3, 7, 2, 12, 1, 6, 4, 8, 15},则构建的线段树如下图所示。

在这里插入图片描述

线段树除了最后一层,其他层构成一颗满二叉树,因此采用顺序存储方式,用一个数组tree[]存储节点。

若一个节点的存储下标为k ,则其左子节点的下标为2k ,其右子节点的下标为2k +1。

在这里插入图片描述

线段树根节点的存储下标为1,其左右子节点的存储下标分别为2、3,有10个元素的线段树,其存储下标如下图所示:

在这里插入图片描述

【2】创建线段树

可以采用递归的方法创建线段树,算法步骤如下:

① 若是叶子节点(l =r ),则节点的最值就是对应位置的元素值。

② 若是非叶子节点,则递归创建左子树和右子树。

③ 节点的区间最值等于该节点左右子树最值的最大值。

[ 算法代码]

void build(int k , int l , int r){ //创建线段树,节点的存储下标为k,节点的区间为 [l , r]
	tree[k].l = l;
	tree[k].r = r;
	
	if(l == r){
		tree[k].mx = a[l];
		return;
	}
	
	int mid , lc , rc;
	mid = (l + r) / 2; //划分点
	lc = k * 2; // 左子节点的存储下标
	rc = k * 2 + 1; //右子节点的 存储下标
	build(lc , l , mid);
	build(rc , mid + 1, r);
	
	tree[k].mx = max(tree[lc].mx , tree[rc].mx); //节点的最大值等于左右子节点 最值的最大值
}
【3】点更新

点更新指修改一个元素的值,例如将a [i ]修改为v 。采用递归进行点更新,算法步骤如下。

① 若是叶子节点,满足l =r 且l =i ,则修改该节点的最值为v。

② 若是非叶子节点,则判断是在左子树中更新还是在右子树中更新。

③ 返回时更新节点的最值。

例如,修改第5个节点的值为14时,先从树根向下找第5个元素所在的叶子节点,将其最值修改为14,返回时更新路径上所有节点的最值(左右子节点最值的最大值)。

在这里插入图片描述

[ 算法代码]

void update(int k , int i , int v){ // 将a[i] 更新为 v
	
	if(tree[k].l == tree[k].r && tree[k].l == i){ //找到a[i]
		
		tree[k].mx = v;
		return ;
	}
	
	int mid , lc, rc;
	mid = (tree[k].l + tree[k].r) / 2; //划分点
	
	lc = k * 2; // 左子节点的存储下标
	rc = k * 2 + 1; // 右子节点的 存储下标
	
	if(i <= mid){
		update(lc , i ,v); // 到左子树中 更新
	}else{
		update(rc , i , v); //到 右子树中更新
	}
	
	tree[k].mx = max(tree[lc].mx , tree[rc].mx); // 返回时更新最值
}
【4】区间查询

区间查询指查询一个[l , r ]区间的最值。采用递归的方法进行区间查询的算法步骤如下:

① 若节点所在的区间被查询区间[l , r ]覆盖,则返回该节点的最值。

② 判断是在左子树中查询,还是在右子树中查询。

③ 返回最值。

例如,在[1, 10]的线段树中查询[3, 5]区间的最值,过程如下。

① 计算树根[1, 10]的划分点,mid=(1+10)/2=5,待查询区间l=3、r =5、r ≤mid,说明查询区间在左子树中,到左子树中查询

在这里插入图片描述

② 计算左子树树根[1, 5]的划分点,mid=(1+5)/2=3,待查询区间l =3、r =5、r >mid、l ≤mid,说明查询区间横跨左右子树两个区间,需要到左、右子树中查询[3, 5],然后求最大值。

在这里插入图片描述

③ 计算左子树树根[1, 3]的划分点,mid=(1+3)/2=2,待查询区间l =3、r =5、l >mid,说明查询区间在右子树中,到右子树中查询,该右子树[3, 3]被查询区间覆盖,返回最值7。

在这里插入图片描述

④ 右子树为[4, 5],待查询区间为[3, 5],被查询区间覆盖,返回区间最值12。

在这里插入图片描述

⑤ 左右子树分别返回最值7、12,然后求最大值,即可得到查询区间[3, 5]的最值为12。

在这里插入图片描述

[ 算法代码]

int query(int k , int l,  int r){ // 求[l ,r] 区间的最值
	
	if(tree[k].l >= l && tree[k].r <= r){ // 查询区间覆盖该节点区间
		return tree[k].mx;	
	}
	
	int mid , lc , rc;
	mid = (tree[k].l + tree[k].r ) / 2; //划分点
	
	lc = k * 2; //左子节点的存储下标
	rc = k * 2 + 1; //右子节点的 存储下标
	
	int Max = -inf; //注意: 局部变量可以,全局变量不可以
	if(l <= mid){
		Max = max(Max , query(lc , l , r)); // 到左子树中查询
	}
	if(r > mid){
		Max = max(Max , query(rc , l , r)); //到右子树中查询
	}
	
	return Max;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程与线程的区别及联系

目录 1. 操作系统功能简介 2. 进程 2.1 认识进程 2.2 进程操作系统中如何管理 2.3 PCB如何描述 2.3.1 pid 2.3.2 内存指针 2.3.3 文件描述符表 2.3.4 进程调度相关属性 3. 内存管理 4. 线程 4.1 认识线程 4.2 进程与线程的关系 4.3 线程安全问题 1.操作系统功能简…

[附源码]计算机毕业设计springboot电子相册管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Git 入门 拉取仓库和推送仓库

目录 基本操作 本地建立仓库并推送到远端仓库 关联仓库失败 解决方法 从远端仓库拉取文件到本地 私有的仓库的连接 修改 提交者名称 IDEA/Pycharm等如何使用git 如何关闭git 功能 Git操作主要分为两类 &#xff0c;如何把自己建的项目同步的网上的仓库&#xff0c;如何…

OpenHarmony编译系统

GN 简介 直接百度 GN 入门 可以参考下面的示例&#xff0c;作为入门参考学习https://blog.csdn.net/weixin_44701535/article/details/88355958https://gn.googlesource.com/gn//main/docs/reference.mdhttps://chromium.googlesource.com/chromium/src/tools/gn//48062805e…

Java项目_在线点餐系统(jsp+sevlet+mysql)(含论文)

在线点餐系统(jspsevletmysql一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.餐桌管理(管理员)7.菜系管理(管理员)8.菜品管理(管理员)9.订单管理(管理员)三、获取源码一、系统介绍 系统主要功能&#xff1a; 用户&#…

4位资深专家多年大厂经验分享出Flink技术架构设计与实现原理

时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Java 面试…

bootstrap下拉菜单学习(五)

组件&#xff1a;下拉菜单 bootstrap字体图标和下拉菜单组件的使用 这些图标都存在我们引入的font文件夹内&#xff1a; 复制bootstrap所用的包&#xff1a; 创建html页面&#xff1a; 图标不仅可以直接放文本里面&#xff0c; 还可有结合按钮去用。 要使用组件&#xff1a;不…

《网络空间测绘技术与实践》正式发售,让网络空间作战“有图可依”

近日&#xff0c;多位业界专家力推&#xff0c;由知道创宇CEO赵伟、CTO杨冀龙、CSO黑哥&#xff08;周景平&#xff09;等撰写的著作《网络空间测绘技术与实践》&#xff0c;正式出版并发售。网络空间已成为继“陆、 海、空、天”后的第五大空间&#xff0c;网络空间亦需要类似…

【uni-app高频面试题——精品一】

uni-app高频面试题谈谈你对uni-app的理解&#x1f355;uni中如何为不同的平台设置不同的代码uniapp中封装接口请求相较于微信小程序有什么要注意的uni-app中的本地存储数据和接收数据是什么✊uni-app 路由与页面跳转&#x1f4aa;uni-app全局变量怎么定义&#xff0c;怎么获取&…

【Python实战】“特种兵”们的专属游戏助手,助你吃鸡:极品小助手也是棒呆了~(“大吉大利,今W吃鸡”)

前言 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 “注意左边&#xff0c;左边有人&#xff0c;打他&#xff01;” “快上车&#xff01;&#xff0…

Spring Security(十九)--OAuth2:实现授权服务器(下)--环境准备以及骨架代码搭建

一、前言 本章我们将在上一章代码骨架搭建好的前提下对三种授权类型进行测试以及讲解如何配置授权服务器以颁发刷新令牌&#xff0c;所以本章是一个比较轻松的章节&#xff0c;但是唯一的要求就是需要小伙伴们对上一章内容要完成代码的搭建&#xff0c;否则这章学习也不知道个…

[附源码]计算机毕业设计springboot飞越青少儿兴趣培训机构管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

嘉创房地产冲刺港交所:半年营收4.7亿 现金及现金等价物减少

雷递网 雷建平 11月28日嘉创房地产控股有限公司&#xff08;简称&#xff1a;“嘉创”&#xff09;日前递交招股书&#xff0c;准备在港交所上市。半年营收4.73亿嘉创为一家精品住宅物业发展商&#xff0c;主要在大湾区的东莞、惠州及佛山迅速发展的住宅市场&#xff08;如东莞…

m半分布式JAC联合接纳控制与用户位置信息的垂直切换matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着无线通信技术的飞速发展&#xff0c;为支持多种不同无线接入技术、不同系统间协作、不同业务类型及终端差异性等需求&#xff0c;未来的无线网络将是一种协作式的异构网络融合架构&#xff0…

文理导航杂志文理导航杂志社文理导航编辑部2022年第12期目录

专题研究《文理导航》投稿&#xff1a;cn7kantougao163.com 初中科学生活化作业优化策略 唐黎娜; 4-6 揭密2022年新高考1卷解析几何解答题 陈思伽; 7-9 初中数学错题资源的有效运用 王丹; 10-12 浅谈陶行知思想在初中体育教学中的应用 王树华; 13-15 高中数…

Error: error:0308010C:digital envelope routines::unsupported(vue2项目报错)

问题描述 在 终端输入 npm run dev 命令&#xff0c;项目运行报错 Error: error:0308010C:digital envelope routines::unsupported 问题原因 node 版本过高&#xff0c;可以在命令行 输入 node -v 查看版本 因为 Node.js 版本是 17 以上所以会运行失败&#xff0c; Node.j…

MySQL为自动编号的字段赋值

insert users values(NULL,ming,fasdfasdfasd,22,1); 或者 insert users values(DEFAULT,ming,fasdfasdfasd,22,1);

分布式消息中间件RabbitMQ解析

RabbitMQ作为分布式消息存储和转发系统&#xff0c;已广泛使用于分布式系统中。本文简要介绍RabbitMQ相关概念、集群架构和消息转发流程&#xff0c;并与Kafka做了简要对比&#xff0c;以加深理解。 1、RabbitMQ相关概念 1.1 AMQP介绍 消息&#xff08;Message&#xff09;是…

【uni-app】详细总结uni-app基础知识和如何配置项目,运行到模拟器和小程序端,附案例和图(建议收藏)

1- uni-app 简介 1.1 介绍 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。 开发者编写一套代码&#xff0c;可发布到 iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;、快应用等多个平台。 详细的 uni-app 官方文档&#…

煤炭行业数据库-煤炭价格、消耗量、发电量分省市民用电、工业用电数据

&#xff08;1&#xff09;煤炭行业数据库 1、数据来源&#xff1a; WIND数据库煤炭资源网 2、时间跨度&#xff1a;至今 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 包含指标如下 煤炭价格 国际煤价&#xff08;周&#xff09; 秦皇岛煤炭价格&#xff08;…