基于完全二叉树实现线段树-- [爆竹声中一岁除,线段树下苦踌躇]

在这里插入图片描述

文章目录

  • 一.完全二叉树
    • 完全二叉树的父子结点引索关系
  • 二.线段树
  • 三.基于完全二叉树实现线段树
    • 关于线段树的结点数量问题的证明
    • 递归建树
    • 递归查询区间和
    • 递归单点修改
    • 线段树模板题

一.完全二叉树

  • 完全二叉树的物理结构是线性表,逻辑结构是二叉树
    在这里插入图片描述

完全二叉树的父子结点引索关系

  • 通过子结点下标引索父结点下标 : 父结点下标 = 子节点下标/2;
  • 通过父结点下标引索左孩子下标 : 左孩子下标 = 父结点下标 * 2;
  • 通过父结点下标引索右孩子下标 : 右孩子下标 = (父结点下标 * 2) + 1;
    在这里插入图片描述

二.线段树

  • 线段树是一种基于分治思想实现的数据结构,用途非常广泛,常用于快速引索动态更新数组的区间和,以及解决众多类型的区间问题
  • 现有一个原数组,线段树结点表示一个结构体,结构体中存储原数组某一段区间的端点下标区间和
struct TreeNode{
	int left;   //原数组区间左端点下标
	int right;  //原数组区间右端点下标
	int Sum;    //区间和
}
  • 线段树根节点存储整个原数组的区间和,然后以区间二分的方式构建左子结点和右子结点:
    在这里插入图片描述
  • 以此类推,形成递归,直到将原数组区间划分为一个个单元素区间为止:
    在这里插入图片描述
  • 建树过程时间复杂度为O(N),引索更新的复杂度都是logN,比如要引索原数组[1,4]的区间和:
    在这里插入图片描述

三.基于完全二叉树实现线段树

在这里插入图片描述

关于线段树的结点数量问题的证明

  • 证明:若根节点的区间长度为N,线段树的总结点数量不会超过4*N
    在这里插入图片描述
  • 使用线段数时,数据范围为N,则定义一个4*N大小的完全二叉树数组防止算法中出现数组越界问题

递归建树

  • int BuildTree(TreeNode * Tree,int index,int left,int right)
    • 调用BuildTree(Tree,1,left,right)从下标1(根节点)开始递归建立线段树,[left,right]表示原数组的区间
    • 返回值表示原数组[left,right]的区间和
void Bulid(TreeNode* Tree,int index , int left , int right){
    //结点赋值
    Tree[index] = {left,right,0};
    if(right == left)return;
    //二分区间
    int mid = ((right - left) >> 1) + left;
    //构建左子树
    Bulid(Tree,index << 1,left, mid);
    //构建右子树
    Bulid(Tree,(index << 1)|1, mid + 1 , right);
}
  • 递归建树的时间复杂度为O(N)

递归查询区间和

  • int Get_Sum(TreeNode* Tree,int index , int left , int right)表示查询原数组[left,right]的区间和
//查询区间和
int Get_Sum(TreeNode* Tree,int index , int left , int right){
    //当前区间被目标区间包含则返回区间部分和
    if(Tree[index].left >= left && Tree[index].right <= right){
        return Tree[index].Sum;
    }
    //二分查询左右子树
    int mid = (Tree[index].left + Tree[index].right) >> 1;
    int res = 0;
    if(mid >= left) res = Get_Sum(Tree,index << 1,left,right);
    if(mid < right) res += Get_Sum(Tree,index << 1 | 1 , left , right);
    return res;
}
  • 关于复杂度的分析:
    在这里插入图片描述

递归单点修改

  • void modify(TreeNode* Tree,int index,int target,int change),原数组下标为target的元素加上change,调用时index1(根节点下标)开始递归
//原数组下标为target的元素加上change
void modify(TreeNode* Tree,int index,int target,int change){
    Tree[index].Sum += change;
    if(Tree[index].left  == Tree[index].right)return;
    //二分被修改区间
    int mid = (Tree[index].left + Tree[index].right) >> 1;
    if(target <= mid) modify(Tree,index << 1,target,change);  //递归修改左子树
    else modify(Tree,index << 1 | 1 , target,change);         //递归修改右子树
}

线段树模板题

线段树模板题1
线段树模板题2

在这里插入图片描述

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

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

相关文章

Dubbo的负载均衡策略剖析

1 Dubbo的负载均衡策略概述 Dubbo的负载均衡策略应用于服务消费方。当服务提供者是集群时&#xff0c;通过在消费方设置负载均衡策略&#xff0c;避免大量请求一直集中在其中的某一个或者某几个服务提供方机器上。 Dubbo提供了多种负载均衡策略&#xff0c;默认为随机策略-Ra…

函数及函数的定义

前言&#xff1a; 在之前介绍指针的时候&#xff0c;小编发现有些地方需要用函数&#xff0c;所以小编决定先带领大家学习函数&#xff0c;然后再学习指针。 函数是从英文function翻译过来的&#xff0c;其实function在英文中的意思就是函数&#xff0c;也是功能的意思&#xf…

【深度学习:MPT-30B】提高开源基础模型的标准

【深度学习&#xff1a;MPT-30B】提高开源基础模型的标准 MPT-30B家族MPT-30B (Base)MPT-30B-InstructMPT-30B-Chat使用 MosaicML Inference 部署 MPT-30B 模型通过 MosaicML 培训定制 MPT-30BLLM Foundry 下一步是什么&#xff1f; 附录致谢数据MPT-30B 8k 上下文窗口微调数据…

【OrangePi Zero2 智能家居】阿里云人脸识别方案

一、接入阿里云 二、C语言调用阿里云人脸识别接口 三、System V消息队列和POSIX 消息队列 一、接入阿里云 在之前树莓派的人脸识别方案采用了翔云平台的方案去1V1上传比对两张人脸比对&#xff0c;这种方案是可行&#xff0c;可 以继续采用。但为了接触更多了云平台方案&…

常用工具类-Collections

常用工具类-Collections 排序操作查找操作填充操作判断集合是否有交集不可变集合 java.util.Collections类是一个工具类&#xff0c;它包含了一些静态方法&#xff0c;用于操作集合&#xff08;如列表和映射&#xff09;。这个类主要用于创建不可修改的集合、填充集合、替换元素…

「优选算法刷题」:数青蛙

一、题目 给你一个字符串 croakOfFrogs&#xff0c;它表示不同青蛙发出的蛙鸣声&#xff08;字符串 "croak" &#xff09;的组合。由于同一时间可以有多只青蛙呱呱作响&#xff0c;所以 croakOfFrogs 中会混合多个 “croak” 。 请你返回模拟字符串中所有蛙鸣所需不…

如何启动若依框架

Mysql安装 一、下载 链接&#xff1a;https://pan.baidu.com/s/1s8-Y1ooaRtwP9KnmP3rxlQ?pwd1234 提取码&#xff1a;1234 二、安装(解压) 下载完成后我们得到的是一个压缩包&#xff0c;将其解压&#xff0c;我们就可以得到MySQL 5.7.24的软件本体了(就是一个文件夹)&…

网络原理(一)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(一) 一. 应用层 应用层是和程序员联系最密切的一层,对于应用层来说,程序员可以自定义应用层协议,应用层的协议一般要约定好以下两部分内容: 根据需求,明确要传输哪些信…

MySQL进阶45讲【19】幻读是什么,幻读会产生什么问题?

1 前言 在MySQL进阶45讲【3】事务隔离的恩恩怨怨这篇文章中&#xff0c;我们有提到过幻读的概念&#xff0c;为了更好地介绍幻读&#xff0c;我们先创建一个表&#xff0c;并添加一些数据&#xff0c;建表和初始化语句如下&#xff1a; CREATE TABLE t ( id int(11) NOTNULL,…

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

【深度学习】:滴滴出行-交通场景目标检测

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主&#xff0c;接实验技术指导1对1 有任…

单目深度估计任意未标记数据:释放大规模数据潜力 | 开源日报 No.166

LiheYoung/Depth-Anything Stars: 2.6k License: Apache-2.0 Depth-Anything 是一个释放大规模未标记数据力量的项目&#xff0c;可以对任意未标记数据进行单目深度估计。 该项目主要功能、关键特性和核心优势包括&#xff1a; 相对深度估计度量深度估计更好的深度条件控制网…

【Java八股面试系列】并发编程-并发关键字,线程池

目录 并发关键字 Synchronized synchronized最主要的三种使用方式&#xff1a; 具体使用&#xff1a;双重校验锁单例模式 synchronized 底层实现原理&#xff1f; synchronized锁的优化 偏向锁 轻量级锁 重量级锁 Mark Word 与 Monitor 之间的关系 总结 偏向锁、轻量…

阿里百秀移动端首页

技术选型 方案:采取响应式页面开发方案技术: bootstrap框架设计图∶设计图采用1280px设计尺寸 屏幕划分分析 屏幕缩放发现中屏幕和大屏幕布局是一致的。因此我们列定义为col-md-就可以了&#xff0c;md是大于等于970以上的屏幕缩放发现小屏幕布局发生变化&#xff0c;因此我…

ArcGIS学习(四)坐标系-1

ArcGIS学习(四)坐标系 大家平时在处理数据的时候肯定经常遇到坐标系相关的问题。最常见的就是同一个地区的两个数据,导入ArcGIS内却对不上;也肯定听到过坐标系相关的一些词语,比如地理坐标系投影坐标系、投影、WGS1984坐标、CGCS2000坐标系、火星坐标系、百度坐标系等。 …

架构(十二)动态Excel

一、引言 作者最近的平台项目需要生成excel&#xff0c;excel的导入导出是常用的功能&#xff0c;但是作者想做成动态的&#xff0c;不要固定模板&#xff0c;那就看看怎么实现。 二、后端 先捋一下原理&#xff0c;前后端的交互看起来是制定好的接口&#xff0c;其实根本上是…

算法学习——华为机考题库9(HJ56 - HJ63)

算法学习——华为机考题库9&#xff08;HJ56 - HJ63&#xff09; HJ56 完全数计算 描述 完全数&#xff08;Perfect number&#xff09;&#xff0c;又称完美数或完备数&#xff0c;是一些特殊的自然数。 它所有的真因子&#xff08;即除了自身以外的约数&#xff09;的和&…

基于idea解决springweb项目的Java文件无法执行问题

前言 上一篇文章的话介绍了spring以及创建spring项目&#xff0c;但是因为有宝子私聊我说创建的项目那个JAVA文件显示灰色还有一个红点&#xff0c;问我怎么解决下面我来简答的写一下怎么修改配置让他正常的运行 配置 原因好像是因为基于maven的JAVA项目构架&#xff0c;对应…

主干网络篇 | YOLOv5/v7 更换主干网络为 VGG13 / VGG16 / VGG19 | 对比实验必备

论文地址:https://arxiv.org/pdf/1409.1556.pdf 在这项工作中,我们研究了卷积网络深度对其在大规模图像识别环境中准确性的影响。我们的主要贡献是对使用非常小(33)卷积滤波器的架构的不断增加深度的网络进行了彻底评估,这表明通过将深度推进到16-19个权重层,可以在先前…