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

news2024/10/7 20:31:55

在这里插入图片描述

文章目录

  • 一.树状数组概览
  • 二.树状数组构造定义
    • 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.coloradmin.cn/o/1434141.html

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

相关文章

Vue中v-if和v-show区别

Vue中v-if和v-show是两个常用的指令&#xff0c;用于控制元素的显示和隐藏。虽然它们都能达到相同的效果&#xff0c;但在实现机制和使用场景上有一些区别。本文将详细介绍v-if和v-show的区别&#xff0c;并且通过示例代码来演示它们的使用。 首先&#xff0c;让我们来看一下v…

Debezium发布历史110

原文地址&#xff1a; https://debezium.io/blog/2021/09/22/deep-dive-into-a-debezium-community-connector-scylla-cdc-source-connector/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 1.7.0.CR2…

世界各国都在追求“主权人工智能能力”,国家级人工智能硬件需求将剧增

NVIDIA的CEO黄仁勋最近在接受媒体采访时指出&#xff0c;世界各国都打算在本国内建立和运行自主的人工智能基础设施&#xff0c;这将全面带动NVIDIA硬件产品需求的飙升。黄仁勋表示&#xff0c;包括印度、日本、法国和加拿大在内的国家政府都在讨论投资“国家主权人工智能能力”…

关于harbor做HA

我起初是用helm在k8s上装的harbor&#xff0c;最近遇到如下故障&#xff1a;就是服务器硬件设备故障突然死机&#xff0c;恰巧是harbor容器所在的服务器&#xff0c;其他在这个服务器上运行的容器&#xff0c;由kubelet调度到其他正常的服务器上重启去了&#xff0c;但harbkor并…

2024.1.26力扣每日一题——边权重均等查询

2024.1.26 题目来源我的题解方法一 使用dfs对每一组查询都求最近公共祖先&#xff08;会超时&#xff0c;通不过&#xff09;方法二 不需要构建图&#xff0c;直接在原始数组上进行求最大公共祖先的操作。 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2846 我的题解 …

[C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow

在OpenCV中&#xff0c;imshow函数默认情况下是不支持滚动条的。如果想要显示滚动条&#xff0c;可以考虑使用其他库或方法来进行实现。 一种方法是使用Qt库&#xff0c;使用该库可以创建一个带有滚动条的窗口&#xff0c;并在其中显示图像。具体步骤如下&#xff1a; 1&…

《汇编语言》- 读书笔记 - 各章检测点归档

《汇编语言》- 读书笔记 - 各章检测点归档 检测点 1.1检测点 2.1检测点 2.2检测点 2.3检测点 3.1检测点 3.2检测点 6.1检测点 9.1 检测点 1.1 1个CPU 的寻址能力为8KB&#xff0c;那么它的地址总线的宽度为 13 。 解&#xff1a;8KB 8192B 213 1KB的存储器有 10…

###C语言程序设计-----C语言学习(9)#函数基础

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 一. 基础知识的学习 1.函数的定义 函数是一个完成特定工作的独立程序模块&…

酷开系统 | 拓展内容营销边界,酷开科技大屏价值全面升维

丰富的内容是智能大屏吸引消费者的关键。随着智能大屏各类垂直应用的增多&#xff0c;和长、短视频等多元内容的加入&#xff0c;使消费者的使用需求进一步激发和释放&#xff0c;这些流量的加入&#xff0c;也使大屏成为了营销的天然宝藏。酷开科技一直致力于OTT大屏营销&…

这个人脸考勤技术,拿走直接套用!请收藏!

随着科技的不断发展&#xff0c;人脸识别技术在各个领域得到了广泛应用&#xff0c;其中之一就是人脸考勤系统。 三维人脸考勤系统作为现代智能考勤的代表&#xff0c;通过先进的人脸识别技术&#xff0c;为组织提供了一种高效、准确、安全的考勤解决方案。 客户案例 制造企业…

【XR806开发板试用】TCP通信测试 Ping 命令测试

1.工程准备 由于要使用wifi功能&#xff0c;直接从wlan_demo复制一份出来&#xff0c;然后修改。 源文件只留下 main.c 就可以了。 BUILD.gn文件 import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_mying") {configs []sources…

【C语言】const修饰指针的不同作用

目录 const修饰变量 const修饰指针变量 ①不用const修饰 ②const放在*的左边 ③const放在*的右边 ④*的左右两边都有const 结论 const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但…

vue - 指令(一)

看文章可以得到什么&#xff1f; 1.可以快速的了解并会使用vue的指令 2.可以加深你对vue指令的理解&#xff0c;知道每个指令代表什么功能​​​​​​​ 目录 什么是vue的指令&#xff1f;​​​​​​​ vue常见指令的使用 v-html v-show v-if v-else 和v-else-…

JVM 性能调优 - Java 中的四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

解决ssh: connect to host 192.168.x.x port 22: Connection refused

我在使用scp命令向另一目标主机传输文件时提示ssh: connect to host 192.168.x.x port 22: Connection refused错误&#xff0c;总结出现的原因&#xff0c;及解决办法。 查看目标主机的ssh服务是否启动 service ssh status 如下图显示则启动状态 如果提示Unit ssh.service co…

python制作恶意软件删除工具

今天&#xff0c;来教大家用python制作一个恶意软件删除工具 查杀流程图 对&#xff0c;就这些&#xff0c;已经具备了杀毒软件的功能 判断文件是否为病毒 要查杀病毒&#xff0c;先要判断文件是不是病毒&#xff08;不然删错了咋办&#xff09;&#xff0c;这里我们用获取文…

『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

多彩贵州人文山水展风采,微环境监测智能调控护古韵

一、人文山水时光峰峦——多彩贵州历史文化展 2月3日&#xff0c;贵州省博物馆向公众开放《人文山水时光峰峦——多彩贵州历史文化展》。6000平方米展厅里&#xff0c;从石器时期开始&#xff0c;通过六个篇章&#xff0c;用3503件文物的回忆链&#xff0c;系统化的向观众揭开…

我要成为嵌入式高手之2月4、5日Linux高编第二天!!

读写函数接口 1、fgetc 语法&#xff1a; 功能&#xff1a;从流中获取一个字符 练习1&#xff1a;编写程序统计文件的行数 #include <stdio.h>int main(void) {FILE *fp NULL;char ch 0;int row 0;fp fopen("file.txt","r");if (NULL fp){pe…

C#验证字符串的长度,用正则表达式 vs 字符数组长度或字符串的长度

目录 一、使用的方法 1.使用正则表达式 2.通过计算字符串的长度验证 二、实例 1.源码 2.生成效果 一、使用的方法 1.使用正则表达式 使用正则表达式可以判断和限制用户输入的字符串长度。 比如验证用户密码不得少于8为&#xff0c;匹配的正则表达式"^.{8,}$"…