数据结构之线段树

线段树

线段树(Segment Tree)是一种高效的数据结构,广泛应用于计算机科学和算法中,特别是在处理区间查询和更新问题时表现出色。以下是对线段树的详细解释:

一、基本概念

线段树是一种二叉搜索树,是算法竞赛中常用的用来维护 区间信息 的数据结构。线段树可以在 O(logn) 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。

原理其实是分治思想。它将整个区间划分成一些单元区间,具有对数级别的高度,从而保证了高效的查询和更新操作。

二、基本结构

  • 根结点:代表整个区间。
  • 内部结点:每个内部结点都代表一个区间,并将其划分为左右两个子区间,分别由左孩子和右孩子表示。
  • 叶结点:代表单元区间,每个叶结点对应原始数据中的一个元素。

对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。

三、示例应用

假设有一个长度为N的数组a,需要频繁地查询任意区间[l,r]的最小值和以及更新数组中的某个元素。使用线段树可以高效地解决这些问题。以下是一个简单的线段树实现示例(以Python代码表示):

class SegmentTree:  
    def __init__(self, nums):  
        self.nums = nums  
        self.n = len(nums)  
        # 初始化线段树,大小为4倍的原数组长度,因为线段树是完全二叉树  
        self.tree = [float('inf')] * (4 * self.n)  
        self.build_tree(0, 0, self.n - 1)  
  
    def build_tree(self, tree_index, l, r):  
        # 如果到达了叶节点  
        if l == r:  
            self.tree[tree_index] = self.nums[l]  
            return  
  
        # 计算左右子节点的索引  
        left_child = 2 * tree_index + 1  
        right_child = 2 * tree_index + 2  
  
        # 递归构建左右子树  
        mid = (l + r) // 2  
        self.build_tree(left_child, l, mid)  
        self.build_tree(right_child, mid + 1, r)  
  
        # 当前节点的值是其左右子节点值的最小值  
        self.tree[tree_index] = min(self.tree[left_child], self.tree[right_child])  
  
    def query(self, l, r):  
        return self.query_tree(0, 0, self.n - 1, l, r)  
  
    def query_tree(self, tree_index, seg_l, seg_r, query_l, query_r):  
        # 如果查询区间完全包含了当前线段树节点代表的区间  
        if query_l <= seg_l and seg_r <= query_r:  
            return self.tree[tree_index]  
  
        # 如果查询区间与当前线段树节点代表的区间没有交集  
        if query_l > seg_r or query_r < seg_l:  
            return float('inf')  
  
        # 计算左右子节点的索引  
        left_child = 2 * tree_index + 1  
        right_child = 2 * tree_index + 2  
  
        # 递归查询左右子树,并取最小值  
        mid = (seg_l + seg_r) // 2  
        left_min = self.query_tree(left_child, seg_l, mid, query_l, query_r)  
        right_min = self.query_tree(right_child, mid + 1, seg_r, query_l, query_r)  
  
        return min(left_min, right_min)  
  
    def update(self, index, value):  
        self.update_tree(0, 0, self.n - 1, index, value)  
  
    def update_tree(self, tree_index, seg_l, seg_r, index, value):  
        # 如果到达了叶节点  
        if seg_l == seg_r:  
            self.nums[index] = value  
            self.tree[tree_index] = value  
            return  
  
        # 计算左右子节点的索引  
        left_child = 2 * tree_index + 1  
        right_child = 2 * tree_index + 2  
  
        # 递归更新左右子树  
        mid = (seg_l + seg_r) // 2  
        if index <= mid:  
            self.update_tree(left_child, seg_l, mid, index, value)  
        else:  
            self.update_tree(right_child, mid + 1, seg_r, index, value)  
  
        # 当前节点的值是其左右子节点值的最小值  
        self.tree[tree_index] = min(self.tree[left_child], self.tree[right_child])  
  
# 示例用法  
nums = [1, 3, 2, 7, 9, 11]  
seg_tree = SegmentTree(nums)  
  
# 查询区间[1, 3]的最小值  
print(seg_tree.query(1, 3))  # 输出: 2  
  
# 更新索引2处的值为0  
seg_tree.update(2, 0)  
  
# 再次查询区间[1, 3]的最小值  
print(seg_tree.query(1, 3))  # 输出: 0

                

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes——part9-2 kubernetes集群java项目上云部署

一、部署前准备工作 1.1 部署项目情况 1.1.1 业务部署架构 单体服务架构分布式服务架构微服务架构超微服务架构 1.1.2 项目涉及第三方服务 关系型数据库系统 MySQL缓存服务 Redis memcache协调服务 zookeeper消息中间件服务 kafka rabbitmq服务注册 服务发现 nacos 1.1.3…

Verilog实现的莫尔斯电码发生器

莫尔斯或者摩尔斯电码(Morse Code)&#xff0c;发明于1837年(另有一说是1836年)&#xff0c;通过不同的排列顺序来表达不同的英文字母、数字和标点符号&#xff0c;在这里作一简单处理&#xff0c;仅产生点(Dit)和划(Dah)&#xff0c;时长在0.25秒之内为点&#xff0c;超过为划…

【输出1到N之间的偶数】

【输出1到N之间的偶数】 C语言实现C实现Java实现Python实现 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 请写程序实现输出1-N之间的所有偶数。 输入 输入一个整数N 输出 如果N<1输出error&#xff0c;否则&#xff0c;输出1-N之间…

Mac上的免费压缩软件-FastZip使用体验实测

FastZip是Mac上的一款免费的压缩软件&#xff0c;分享一下我在日常使用中的体验 压缩格式支持7Z、Zip&#xff0c;解压支持7Z、ZIP、RAR、TAR、GZIP、BZIP2、XZ、LZIP、ACE、ISO、CAB、PAX、JAR、AR、CPIO等所有常见格式的解压 体验使用下来能满足我所有的压缩与解压的需求&a…

华为云计算知识总结——及案例分享

目录 一、华为云计算基础知识二、华为云计算相关案例实战案例一&#xff1a;搭建弹性云服务器&#xff08;ECS&#xff09;并部署Web应用案例二&#xff1a;构建基于OBS的图片存储和分发系统案例三&#xff1a;基于RDS的高可用数据库应用案例四&#xff1a;使用华为云DDoS防护保…

RHCE——DNS域名解析服务器、selinux、防火墙

1、DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网。 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使…

使用PostgreSQL进行高效数据管理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用PostgreSQL进行高效数据管理 PostgreSQL简介 安装PostgreSQL 在Ubuntu上安装PostgreSQL 在CentOS上安装PostgreSQL 在macOS上…

实现GUI界面中的logo图片的编码与隐藏

实现GUI界面中的logo图片的编码与隐藏 一、问题描述二、解决办法 一、问题描述 利用PyQt5编写的GUI界面&#xff0c;有时候需要我们添加自定义的图片来作为UI界面的logo&#xff0c;在源码使用时&#xff0c;logo的形式一般不影响使用&#xff0c;但是当我们需要将软件进行打包…

真·香!深度体验 zCloud 数据库云管平台 -- DBA日常管理篇

点击蓝字 关注我们 zCloud 作为一款业界领先的数据库云管平台&#xff0c;通过云化自治的部署能力、智能巡检和诊断能力、知识即代码的沉淀能力&#xff0c;为DBA的日常管理工作带来了革新式的简化与优化。经过一周的深度体验&#xff0c;今天笔者与您深入探讨 zCloud 在数据库…

Docsify文档编辑器:Windows系统下个人博客的快速搭建与发布公网可访问

文章目录 前言1. 本地部署Docsify2. 使用Docsify搭建个人博客3. 安装Cpolar内网穿透工具4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows环境本地部署 Docsify 这款以 markdown 为中心的文档编辑器&#xff0c;并即时生成您的文档博客网站&#xff0c;结合…

AI虚拟主播中的订单处理模块开发探索‌!

‌AI虚拟主播作为新兴的数字媒体形式&#xff0c;正在逐步改变着内容创作与传播的格局&#xff0c;它们不仅能够提供24小时不间断的直播服务&#xff0c;还能通过智能算法实现与观众的实时互动&#xff0c;极大地丰富了用户体验。 而在AI虚拟主播的背后&#xff0c;一个高效、…

Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在医疗资源日益紧张的背景下&#xff0…

【快速上手】pyspark 集群环境下的搭建(Standalone模式)

目录 前言 &#xff1a; 一、spark运行的五种模式 二、 安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 三、集群启动/关闭 四、打开监控界面验证 前…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体&#xff0c;它用于条件编译和 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;。enable_if 的主要作用是通过条件编译来控制模板的实例化&#xff0c;从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

放大器稳定性分析

1 稳定性的时域体现 下图的放大器构成的跟随电路且反向输入端有一个电容&#xff0c;电路工作过程如下&#xff1a;输入Vin从0开始增大&#xff0c;Vout也开始上升&#xff0c;Vout通过R给C充电&#xff0c;Vfb点电压随着电容的充电增加&#xff0c;Vfb就相对与Vout存在时延&a…

学习记录:基于Z-Stack 3.0.1的Zigbee智能插座实现

引言 本文记录了笔者基于Z-Stack 3.0.1协议栈&#xff0c;通过学习Zigbee通信协议&#xff0c;实现一个简单的智能插座控制过程。通过这个过程&#xff0c;笔者对Zigbee网络的形成、设备间的通信以及低功耗设计有了更深入的理解。 工程代码链接&#xff1a;链接&#xff1a;h…

Python Matplotlib 如何处理大数据集的绘制,提高绘图效率

Python Matplotlib 如何处理大数据集的绘制&#xff0c;提高绘图效率 在数据分析和可视化的过程中&#xff0c;处理大数据集常常是我们面临的挑战。绘制大数据集不仅需要时间和计算资源&#xff0c;还可能导致图形显示不流畅&#xff0c;甚至崩溃。Matplotlib 是 Python 中一个…

2016-2020年全国保护性耕作/常规耕作农田分类数据集

2016-2020年全国保护性耕作/常规耕作农田分类数据集 数据介绍 基于Sentinel-2遥感产品&#xff0c;使用来自文献调研和目视解译产生的保护性/常规耕作样本点&#xff0c;通过交叉验证方法训练随机森林分类器&#xff0c;生成了2016-2020年全国保护性耕作/常规耕作农田分类数据…

VMware系统镜像推荐网站

今天准备找一个Mac系统的镜像&#xff0c;在网上搜大部分都是广告&#xff0c;有的还做的很隐蔽&#xff0c;不点进去都无法确定&#xff0c;非常麻烦&#xff0c;不如多花点时间自己整理一个使用的网站。 如果有更优推荐&#xff0c;请在评论中说明&#xff0c;我会及时更新并…

国标GB28181-2022平台EasyGBS国标GB28181软件:GB/T28181-2022解读、应用和技术实现

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一变革中&#xff0c;国标GB28181-2022平台EasyGBS作为一款基于GB28181标准的视频监控集成与管理平台&#xff0c;凭借其卓越的性能、高度的灵活性和用户友好的设计&#…