区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作”

news2024/11/27 4:13:53

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作”

之前我们已经说了对线段树的点更新和区间查询,若要求对区间中的所有点都进行更新,该怎么办?

若对区间的每个点都进行更新,则时间复杂度较高,可以引入懒操作。下面讲解带有懒标记的区间更新和区间查询操作。

【1】 区间更新

对[l , r ]区间进行更新,例如将[l , r ]区间的所有元素都更新为v ,步骤如下。

① 若当前节点的区间被查询区间[l , r ]覆盖,则仅对该节点进行更新并做懒标记,表示该节点已被更新,对该节点的子节点暂不更新。

② 判断是在左子树中查询还是在右子树中查询。在查询过程中,若当前节点带有懒标记,则将懒标记下传给子节点(将当前节点的懒标记清除,将子节点更新并做懒标记),继续查询。

③ 在返回时更新最值。

例如,在[1, 10]区间的线段树中修改[4, 8]区间的值为20,其过程如下。

① 先判断[4, 8]区间是否覆盖树根区间[1, 10],树根划分点mid=(1+10)/2=5,查询区间横跨树根的左右子树区间,分别到左右子树中查找区间[4, 8],若当前节点有懒标记,则下传懒标记。

在这里插入图片描述

② 在左子树[1, 5]中查找更新区间[4, 8],划分点mid=(1+5)/2=3,查询区间在右子树中,到右子树[4, 5]中查找区间[4,8],若该节点有懒标记,则下传懒标记。更新区间[4, 8]正好覆盖[4,5]区间,更新最值并做懒标记。

在这里插入图片描述

③ 在右子树[6, 10]中查找更新区间[4, 8],划分点mid=(6+10)/2=8,查询区间在左子树中,到左子树[6, 8]中查找更新区间[4, 8],若该节点有懒标记,则下传懒标记。更新区间[4, 8]正好覆盖[6, 8]区间,更新最值并做懒标记。

在这里插入图片描述

④ 返回时,更新节点的最值为其左右子树最值的最大值。

在这里插入图片描述

[算法代码]

void lazy(int k , int v){
	tree[k].mx = v; //更新最值
	tree[k].lz = v; //做懒标记
}

void pushdown(int k){ // 向下传递懒标记
	
	lazy(2 * k , tree[k].lz); // 下传给左子节点
	lazy(2 * k + 1, tree[k].lz); //下传给 右子节点
	tree[k].lz = -1; //清除自己的 懒标记
}

void update(int k , int l , int r , int v){ //将[l ,r ] 区间的所有元素 都更新为 v
	
	if(tree[k].l >= l && tree[k].r <= r){ // 找到该区间
		return lazy(k , v); // 更新并做懒标记
	}	
	if(tree[k].lz != -1){
		pushdown(k); // 懒标记下传
	}
	
	int mid , lc ,rc ;
	mid = (tree[k].l + tree[k].r) / 2; // 划分点
	lc = k * 2; //左子节点的存储下标
	rc = k * 2 + 1; //右子节点的存储下标
	
	if(l <= mid){
		update(lc , l , r ,v); //到左子树中更新
	}
	if(r > mid){
		update(rc , l , r, v); //到右子树中更新
	}
	tree[k].mx = max(tree[lc].mx , tree[rc].mx); //返回时更新最值
}

【2】区间查询

带有懒标记的区间查询和普通的区间查询有所不同,在查询过程中若遇到节点有懒标记,则下传懒标记,继续查询。

例如,查询[6, 7]区间的最值,过程如下。

① 求树根[1, 10]的划分点,mid=(1+10)/2=5,查询区间[6, 7]在右子树中,继续判断,经过[6, 8]区间时,该节点有懒标记,则下传懒标记(当前节点的懒标记清除,下传至左右子节点)。

在这里插入图片描述

② 继续判断,找到[6, 7]区间,返回该区间的最值即可。

在这里插入图片描述

[算法代码]

int query(int k , int l , int r){ // 求[l .. r] 区间的最值
	
	int Max = -inf;
	if(tree[k].l >= l && tree[k].r <= r){ // 找到该区间
		return tree[k].mx;
	}
	if(tree[k].lz != -1){
		pushdown(k); //懒标记下传
	}
	
	int mid , lc , rc;
	mid = (tree[k].l + tree[k].r) / 2; //划分点
	
	lc = k * 2; // 左子节点的 存储下标
	rc = k * 2 + 1; //右子节点 的存储下标
	
	if(l <= mid){
		Max = max(Max , query(lc , l , r)); //到左子树中查询
	}
	if(r > mid){
		Max = max(Max , query(rc, l , r)); // 到右子树中查询
	}
	
	return Max;
}

【3】算法分析

线段树采用了分治算法策略,其点更新、区间更新、区间查询均可在O (logn )时间内完成。树状数组和线段树都用于解决频繁修改和查询的问题,树状数组可以实现点更新、区间和查询,线段树可以实现点更新、区间更新和区间查询。

树状数组比线段树节省空间,代码简单易懂,但是线段树用途更广、更灵活,凡是可以用树状数组解决的问题都可以用线段树解决。

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

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

相关文章

Cocos2d-x 3D渲染技术 (三)

包围盒算法 说白了就是给物体装进一个盒子里&#xff0c;该盒子可以装下物体。目的是为了进行碰撞检测。 种类&#xff1a; 球状碰撞体立方体碰撞体胶囊碰撞体Mesh碰撞体 实现原理是OBB包围盒。 经常使用的两种碰撞算法是OBB包围盒和AABB包围盒算法。 OBB包围盒算法 方向…

JavaScript -- 01. 基础语法介绍

文章目录基础语法1 Hello World2 JS的编写位置3 基本语法3.1 多行注释3.2 单行注释3.3 区分大小写3.4 空格和换行会被忽略3.5 以分号结尾3.6 字面量3.7 变量3.8 变量的内存结构3.9 常量3.10 标识符基础语法 JS的基本语法 1 Hello World js的三种输出方式 <!DOCTYPE html&g…

精彩回顾 | 云原生系统软件的产业应用

11月18日&#xff0c;2022年第五届中国金融科技产业大会暨第四届中新&#xff08;苏州&#xff09;数字金融应用博览会“基础软件与云原生系统软件”分论坛成功举办。该论坛由由中国计算机学会CTO CLUB&#xff08;苏州&#xff09;承办&#xff0c;江苏省金融科技云原生融合创…

如何用 Python 做一个简单的翻译工具?

前言 平时经常在网上翻译一些单词&#xff0c;突发奇想&#xff0c;可不可以直接调某些免费翻译网站的接口呢&#xff1f;然后做一个图形界面的翻译小工具&#xff1f;下面开始实践 &#xff08;文末送读者福利&#xff09; 1.先找一下有哪些免费翻译的接口 百度了一下关键字…

神经架构搜索的综合调查:挑战和解决方案(二)

4 PERFORMANCE COMPARISON NAS 是一项很有前途的研究。在本节中&#xff0c;我们根据主流搜索方法 [27, 28] 对现有 NAS 的性能进行分类和比较&#xff0c;同时还根据第 3 节报告了它们使用的优化策略。这些搜索方法主要包括以下内容&#xff1a;强化学习&#xff08;RL&#…

操作系统学习笔记(Ⅲ):内存

目录 1 内存管理 1.1 内存基础知识 1.内存 2.进程运行 1.2 内存管理的概念 1.3 覆盖与交换 1.覆盖 2.交换 3.区别 1.4 连续分配管理方式 1.单一连续分配 2.固定分区分配 3.动态分区分配 1.5 动态分区分配算法 1.首次适应算法 2.最佳适应算法 3.最坏适应算法 …

网络安全与IP安全

网络安全 是指网络系统的硬件&#xff0c;软件以及系统中的数据收到的保护。 保护的基本属性为&#xff1a;机密性&#xff0c;身份认证&#xff0c;完整性和可用性&#xff1b; 基本特征&#xff1a;相对性&#xff0c;时效性&#xff0c;相关性&#xff0c;不确定性&#xf…

React项目实战之租房app项目(六)渲染房源列表axios优化封装顶部搜索栏列表找房模块之条件筛选

前言 目录前言一、地图找房模块-获取并渲染房源列表1.1 房源列表示例图1.2 实现步骤1.3 代码示例二、axios优化2.1 问题概述2.2 配置生产环境和开发环境2.3 axios优化三、封装顶部搜索导航栏四、列表找房模块-导入顶部导航栏组件五、列表找房模块-条件筛选&#xff08;上&#…

Python将Excel文件插入Mysql数据库(脚本)

目录前言最近接到一个需求&#xff0c;就是将多个Eccel文件&#xff08;表头相同&#xff1b;每个都非常大&#xff0c;约60多万行&#xff0c;每个都是&#xff01;&#xff01;&#xff09;先合并在一起&#xff0c;再做一些处理&#xff0c;但是Excel表格一个文件根本存不下…

Python矩阵乘法 二重循环实现 + 列表推式

这是python 矩阵乘法的简单例子 col 2 row 2 a [[1, 2], [3, 4]] b [[5, 6], [7, 8]] c [[0, 0], [0, 0]] “”" a b c 二维矩阵初始化 c [[0 for col in range(col)] for row in range(row)] a [[0 for col in range(col)] for row in range(row)] b [[0 for c…

Android热修复,精简学习

接入热修复 接入热修复流程如下&#xff1a; 配置开发环境在控制台创建应用在客户端创建新工程签名配置加密信息编写代码发布带有热修复功能的客户端版本 配置开发环境 在控制台创建应用 在控制台创建 mPaaS 应用。此时&#xff0c;本地还没有带签名的 APK&#xff0c;因此…

面试:插件化相关---broadcastReceiver

实现原理 1 采用的模型 Android中的广播使用了设计模式中的观察者模式&#xff1a;基于消息的发布 / 订阅事件模型因此&#xff0c;Android将广播的发送者 和 接收者 解耦&#xff0c;使得系统方便集成&#xff0c;更易扩展 2 模型讲解 模型中有3个角色&#xff1a; 消息订阅…

小程序项目结构

pages 用来存放所有小程序的页面utils 用来存放工具性质的模块(例如:格式化时间的自定义模块)app.js 小程序项目的入口文件app.json 小程序项目的全局配置文件app.wxss 小程序项目的全局样式文件project.config.json 项目的配置文件sitemap.json 用来配置小程序及其页面是否允许…

【数据结构-查找】散列表

文章目录1 线性探测法1.1 查找成功时的 ASL1.2 查找失败时的 ASL1.3 散列表的装填因子 α2 拉链法1 线性探测法 1.1 查找成功时的 ASL 查找元素 47&#xff08;散列函数&#xff1a;3&#xff09;次数&#xff1a;1查找元素 7&#xff08;散列函数&#xff1a;11&#xff09;次…

云上办公便捷、安全,就用华为云桌面

云上办公便捷、安全&#xff0c;就用华为云桌面&#xff01; 根据IDC提出的“未来工作空间”的概念&#xff0c;未来工作空间意味着将打破时空与地域的限制&#xff0c;让员工随时随地工作。未来工作空间也将成为企业整体数字化转型战略中的必要组成部分。 恰逢其时&#xff0…

kubernetes Pod详解

文章目录Pod生命周期创建和终止pod的创建过程pod的终止过程初始化容器钩子函数容器探测重启策略Pod调度定向调度NodeNameNodeSelector亲和性调度NodeAffinityPodAffinityPodAntiAffinity污点和容忍污点&#xff08;Taints&#xff09;容忍&#xff08;Toleration&#xff09;Po…

【测试沉思录】19. 如何设置 JMeter 线程组?

作者&#xff1a;宋赟 编辑&#xff1a;毕小烦 最近有不少测试同学问我 JMeter 线程组如何设置并发的问题&#xff0c;发现很多人对线程组里的参数不是很清楚&#xff0c;今天就科普一下 JMeter 线程组的信息&#xff0c;也简单介绍一下不同场景的并发策略。 1. 线程组是什么 …

制作一个简单HTML游戏网页(HTML+CSS)米哈游 1页 带轮播图

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游戏官网 | 游戏网站 | 电竞游戏 | 游戏介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 …

K3S +Helm+NFS最小化测试安装部署只需十分钟

作者&#xff1a;郝建伟 k3s 简介 官方文档&#xff1a;k3s 什么是k3s k3s 是一个轻量级的 Kubernetes 发行版 它针对边缘计算、物联网等场景进行了高度优化。 k3s 有以下增强功能&#xff1a;打包为单个二进制文件。 使用基于 sqlite3 的轻量级存储后端作为默认存储机制。…

【附源码】计算机毕业设计JAVA专利查询与发布系统设计与实现

【附源码】计算机毕业设计JAVA专利查询与发布系统设计与实现 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…