深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

在这里插入图片描述

文章目录

  • 一.树状数组概览
  • 二.树状数组构造定义
    • lowbit运算
    • 树状数组的结点值的定义
    • 树状数组结点层次的定义
    • 树状数组父子结点关系定义
  • 三.关于树状数组结构的重要证明
    • 引理1
    • 引理2
    • 树状数组模板题

一.树状数组概览

  • 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉树
    在这里插入图片描述
  • 对于一个原数组,树状数组可以动态维护原数组的区间和
  • 下文中[]表示闭区间(包含端点),()表示开区间(不包含端点)

二.树状数组构造定义

lowbit运算

  • 得到一个整数二进制最低位的1的运算
int lowbit(int n){return n & (-n);
}
  • 根据计算机补码原理不难证明:
    在这里插入图片描述

树状数组的结点值的定义

  • 设原数组为arr,树状数组为Tree,Tree[n]表示原数组arr下标区间[n-lowbit(n)+1,n]中所有数的和
    在这里插入图片描述

  • 根据树状数组的结点值的定义,很容易可以得到一个求原数组前缀和的递归表达式:
    在这里插入图片描述

  • 现有树状数组Tree,可以给出求原数组arr区间[1,n]前缀和的函数:

int Get_Sum(int * Tree,int n){if(n == 0)return 0;return Get_Sum(Tree,n - lowbit(n)) + Tree[n];
}
  • 不难分析,该递归函数的时间复杂度为logN级别

树状数组结点层次的定义

  • 树状数组Tree[n]结点的层次为n二进制表示末位连续0的个数
  • 根据该定义可知,树状数组所有奇数位结点层次全部为0
    在这里插入图片描述
  • 根据该定义可知,设树状数组中结点x的层数为k,则结点x+lowbit(x)的层数一定大于k(根据lowbit运算的定义很容易可以证明)

树状数组父子结点关系定义

  • 树状数组Tree[n]结点的父节点定义为:Tree[n+lowbit(n)]
  • 根据上述定义,可以直观地感受一下树状数组的逻辑结构:
    在这里插入图片描述
    在这里插入图片描述

三.关于树状数组结构的重要证明

引理1

  • 引理1:树状数组第x个结点父结点所代表的原数组和区间[x+lowbit(x)-lowbit(x+lowbit(x))+1,x+lowbit(x)]包含x
    • 由于lowbit(x + lowbit(x)) > lowbit(x),所以x+lowbit(x)-lowbit(x+lowbit(x))+1 <= x,引理1成立

引理2

  • 引理2:树状数组第x个结点到其父结点之间的所有节点(不包括x结点和其父结点)所代表的原数组的和区间不包含x
    • 证明:在这里插入图片描述
    • 最严格的证明应写成数学表达式,但考虑到直观性,这里略过了(其实并不难)
  • 根据引理1和引理2,当原数组某个数arr[i]改变Δx时,树状数组只需从结点Tree[i]开始,沿着树中的路径向上层将每一个结点的值改变Δx就可以维持树状数组的数据结构完整性,实现了区间和的动态更新,时间复杂度为logN
    在这里插入图片描述
  • 原数组第n个元素改变change,树状数组Tree的更新函数:
//size表示树状数组的长度
void UpDate(int * Tree ,int size,int n , int change){for(int i = n  ; i <= size ; i+=lowbit(i)){Tree[i] += change;}
}

树状数组模板题

树状数组模板题1
树状数组模板提2

在这里插入图片描述

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

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

相关文章

C语言——O/动态内存管理

目录 一、为什么要有动态内存分配 二、malloc 和 free 1、malloc 2、free 三、calloc和realloc 1、calloc 2、realloc 四、常见的动态内存的错误 1、对NULL指针的解引用操作 2、对动态开辟空间的越界访问 3、对非动态开辟内存使用 free 释放 4、使用free释放一块动…

详细关于如何解决mfc140.dll丢失的步骤,有效修复mfc140.dll文件丢失的问题。

mfc140.dll文件是Microsoft Visual Studio 2015程序集之一&#xff0c;它包含用于支持多种功能的代码和库。当这个mfc140.dll文件丢失时&#xff0c;可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到mfc140.dll丢失的问题&#xff0c;但是这并不是不可解决的困难。…

Linux中判断文件系统的方法

文章目录 Linux中判断文件系统的方法1.使用mount命令2.使用blkid命令3.使用file命令4.使用fstab文件5.使用df命令&#xff08;这个用的比较多&#xff09;6.使用fsck命令7.使用lsblk命令(推荐-简单好用) Linux中判断文件系统的方法 1.使用mount命令 # 这样查看的只有已经挂载…

浅谈连续逆F类的基础理论-波形、最佳阻抗、输出功率

浅谈连续逆F类的基础理论 各种逆类型的功放好像都少引人关注&#xff0c;因为很多人学完正的连续B/J类和连续F类&#xff0c;想当然的类推到了连续逆F类上面去。貌似连续逆F类就是连续F类的电压电流交换一下而已&#xff0c;无需额外的注意&#xff0c;实际并非那么简单的。 浅…

2024年全球手机市场复苏 传音打响出海品牌进阶之战

2024年智能手机将迎来新一轮“增长季”。根据市场研究机构TechInsights的最新预测&#xff0c;2024年全球智能手机市场将恢复低个位数的增长。对广大手机厂商来说&#xff0c;这无疑是个好消息&#xff0c;但如何在逐渐回暖却竞争激烈的市场中站稳脚跟就需要他们“各显神通”了…

邮件群发软件有效果吗?邮箱如何群发邮件?

邮件群发软件如何选择比较好&#xff1f;推荐的EDM邮件批发系统&#xff1f; 许多人开始寻找提高工作效率和推广业务的方法。其中&#xff0c;一种备受关注的工具是邮件群发软件。那么&#xff0c;究竟邮件群发软件是否有效呢&#xff1f;蜂邮EDM将深入探讨这个问题&#xff0…

如何在Vue应用程序中使用Vue-Router来实现路由嵌套动画效果

Vue-Router是Vue.js官方的路由管理插件&#xff0c;可以帮助我们轻松管理应用程序的路由。除了基本的路由功能外&#xff0c;Vue-Router还允许我们在切换路由时添加动画效果&#xff0c;提升用户体验。本文将介绍如何使用Vue-Router来实现路由嵌套动画效果&#xff0c;并提供具…

nginx初学者指南

一、启动、停止和重新加载配置 前提&#xff1a;先要启动nginx 在Windows上启动nginx的步骤如下&#xff1a; 1. 下载并安装nginx。可以从nginx官网下载适合自己操作系统的版本&#xff0c;一般是zip压缩包&#xff0c;解压到指定目录中。 2. 进入nginx的安装目录&#xff…

基于Java (spring-boot)的实验室管理系统

一、项目介绍 基于Java (spring-boot)的交通管理系统功能&#xff1a;注册登录、个人信息管理、驾驶证业务类型管理、机动车业务类型管理、新闻类型管理、违法处理业务类型管理、驾驶证业务管理、机动车业务管理、新闻管理、违法处理业务管理、用户管理。 二、作品包含 ​ 三、…

(源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模

本篇文章是: 2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模的源码版本,包含具体建模代码到生成模型步骤。那么废话不多说直接开始展示建模过程建模: 数据预处理 之前我给大家提供的一年的风暴数据是远远不够的,要做时…

Redis核心技术与实战【学习笔记】 - 14.Redis 旁路缓存的工作原理及如何选择应用系统的缓存类型

概述 我们知道&#xff0c;Redis 提供了高性能的数据存取功能&#xff0c;广泛应用在缓存场景中&#xff0c;既可以提升业务的响应速度&#xff0c;又可以避免把高并发的请求发送到数据库。 如果 Redis 做缓存时出现了问题&#xff0c;比如说缓存失效&#xff0c;那么&#x…

C++进阶--搜索二叉树

概念 搜索二叉树是一种特殊的二叉树&#xff0c;其具有以下特点&#xff1a; 1.对于每个结点&#xff0c;它的左子树中的所有节点的值都小于该节点的值&#xff0c;而右子树中的所有节点的值都大于该节点的值。 2.左子树和右子树都是搜索二叉树。 这个 特性使得搜索二叉树可…

2024初始Spring(并使用idea创建springweb项目)

前言 spring呢&#xff0c;以前一直是简单的了解&#xff0c;并没有利用空闲时间去进行对应的深入的学习&#xff0c;今天呢原本是打算好好学的&#xff0c;然后后来呢感觉还是太早了接触&#xff0c;打算把前面知识在过一编之后再开始 Spring介绍 Spring | Home 大家想要访…

SQL必知必会笔记(13~16章)

第十三章 创建高级联结 1、别名&#xff1a;缩短SQL语句&#xff0c;允许在一条Select语句中多次使用相同的表 SELECT A.Name, A.Maths, A.English FROM transcript AS A INNER JOIN student_id As B ON A.Name B.Name; 2、Oracle数据库中没有AS关键字&#xff0c;直接在表名或…

英码科技携手昇腾共建算力底座:推出EA500I超强AI处理能力边缘计算盒子!

在数字经济浪潮中&#xff0c;算力已成为不可或缺的驱动力&#xff0c;为各行各业的数字化转型提供了强大的推动力。面对多元化和供需不平衡的挑战&#xff0c;需要实现从理论架构到软硬件实现的质的飞跃&#xff0c;以满足持续增长的算力需求&#xff0c;华为昇腾在这一方面展…

VS Code+Live Server插件开发游戏并结合内网穿透分享好友异地访问

文章目录 前言1. 编写MENJA小游戏2. 安装cpolar内网穿透3. 配置MENJA小游戏公网访问地址4. 实现公网访问MENJA小游戏5. 固定MENJA小游戏公网地址 前言 本篇教程&#xff0c;我们将通过VS Code实现远程开发MENJA小游戏&#xff0c;并通过cpolar内网穿透发布到公网&#xff0c;分…

人脸识别基本流程

人脸识别一般包括&#xff1a;人脸检测、人脸对齐、人脸特征提取和人脸比对四个步骤 人脸检测&#xff1a;检测到人脸的位置人脸对齐&#xff1a;同一个人采集到的不同图像可能呈现出不同的姿态和表情等&#xff0c;这种情况是不利于人脸特征提取的。所以有必要将人脸图像都变…

ubuntu系统下c++ cmakelist vscode debug(带传参的debug)的详细示例

c和cmake的debug&#xff0c;网上很多都需要配置launch.json&#xff0c;cpp.json啥的&#xff0c;记不住也太复杂了&#xff0c;我这里使用cmake插件带有的设置&#xff0c;各位可以看一看啊✌(不知不觉&#xff0c;竟然了解了vscode中配置文件的生效逻辑&#x1f923;) 克隆…

【PPT密码】ppt设置的编辑密码,如何取消?

不知道大家是否了解PPT文件的编辑密码&#xff0c;首先ppt中没有限制编辑功能&#xff0c;设置为只读模式后仍然可以编辑文件&#xff0c;但其实有一种类似于限制编辑的加密方式。在我们打开PPT文件的时候会有密码输入框。 如果我们没有输入密码&#xff0c;以只读方式进入&…

Linux项目自动化构建工具之make/Makefile演示gcc编译

文章目录 一、背景二、如何使用&#xff1f;三、原理四、关于make的问题五、再次理解/编写makefile依赖关系依赖方法 六、原理讲解项目清理makefile是支持变量的取消执行make后显示命令依赖方法可以多行 一、背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备…