树状数组详解

news2024/9/22 9:38:30

问题引入

为了做到对区间的快速查询,可能你会想到前缀和来优化这个查询,这样区间查询的话是O(1)的复杂度。但如果发生了单点更新,在之后的所有前缀和都要更新,修改的时间复杂度是O(n),并不能解决问题。

线段树

为了避免每次区间查询都要遍历每个元素,我们可以把数字两两求和,并存到另一个数组,这样时间就能节省一半,我们以此类推,就形成了一个 树 的结构

这就是线段树,即便需要求和的数字有很多,我们也可以通过这些额外数组快速求出。

但是同时我们会发现线段树有一些数据是我们不需要的,比如求前2、或者前3个数的和时,我们都用不上 第二层(从下往上)的 第二个元素 5;而在求前4、或者前5个数的和时,我们用第三层(从下往上)的 第一个元素 19更好。

在线段树里类似于这种不需要的数据还有很多,所有层的第偶数个数字都是没用的,去掉也不影响计算

我们观察剩下的数据,会发现刚好有 n 个,我们将其放到一个数组中,这个数组就叫 树状数组

树状数组

树状数组和线段树的区别

线段树比树状数组的扩展性要强,树状数组可以看成是线段树的删减版。线段树能解决的问题,树状数组大部分也可以,但是并不一定都能解决。

树状数组的应用

  • 单点修改,区间查询;
  • 区间修改,单点查询;
  • 区间修改,区间查询
  • ......

lowbit函数

如何计算一个非负整数n在二进制下的最低为1及其后面的0构成的数:

例如:44= (101100) (二进制);最低为1和后面的0构成的数是 100 (二进制) = 4

按位与(&)可得到

  

lowbit(x) = x&(-x)

树状数组结构分析

上面是树状数组的结构图,t[x] 保存 以 x 为根的子数中叶子节点值的和,原数组为a[ ]

我们可以发现:

  • t[x] 节点覆盖的长度就是 lowbit(x)
  • t[x] 节点的父节点为 t[x+ lowbit(x)]  
  • 整棵树的深度为 (\log n)+1

单点修改

树状数组从下往上每一层都需要修改

public static void singleAdd(int i,int number){
        for(int x=i;x<=n;x+=lowbit(x)){
            treeVis[x]+=number;
        }
    }

区间查询

前缀和

 可以发现 向左上找上一个节点 只需要将下标 -= lowbit(这个节点的下标)

这样可根据前缀和求出任意区间和

 //求 i 到 j 的区间和
    public static int search(int i,int j){
        int ans=0;
        //求前 j个元素的和
        for(int x=j;x>0;x-=lowbit(x))ans+=treeVis[x];
        //减去前 i-1个元素的和
        for (int x=i-1;x>0;x-=lowbit(x))ans-=treeVis[x];
        return ans;
    }

 

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

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

相关文章

自动化构建工具(Makefile/make)

什么是自动化构建工具 俗话说,会不会写Makefile可以从侧面表达出一个人是否具有完成大型项目的能力。试想一下&#xff0c;一个工程里面有数不尽的源文件&#xff0c;按照各自的&#xff0c;模块&#xff0c;类型放在不同的目录中&#xff0c;如果我要要去编译这个源文件&…

【真题解析】系统集成项目管理工程师 2021 年上半年真题卷(案例分析)

本文为系统集成项目管理工程师考试(软考) 2021 年上半年真题&#xff08;全国卷&#xff09;&#xff0c;包含答案与详细解析。考试共分为两科&#xff0c;成绩均 ≥45 即可通过考试&#xff1a; 综合知识&#xff08;选择题 75 道&#xff0c;75分&#xff09;案例分析&#x…

FEW-SHOT CLASS INCREMENTAL LEARNING

Few-shot class-incremental learning (FSCIL) Neural Collaps有以下四个性质&#xff1a; 在第t个session的时候优化 其中&#xff0c;

研究人员发现新的Linux内核 “StackRot “特权升级漏洞

报道称&#xff0c;Linux内核中出现了一个新的安全漏洞&#xff0c;可能允许用户在目标主机上获得更高的权限。 该漏洞被称为StackRot&#xff08;CVE-2023-3269&#xff0c;CVSS评分&#xff1a;7.8&#xff09;&#xff0c;影响Linux 6.1至6.4版本。迄今为止&#xff0c;没有…

Docker容器内无法解析域名:Temporary failure in name resolution

解决办法 说明&#xff1a;我的操作环境为CentOS 8&#xff0c;与CentOS 7使用命令完全一致。其他不同Linux系统版本命令可能会有所不同&#xff0c;请根据自己的系统版本使用对应命令&#xff0c;直接百度相关操作即可。 1. 检查主机网络设置。 1. 检查主机网络设置 cat /pr…

什么是数字化转型?企业数字化转型包括哪些方面?

什么是数字化转型&#xff1f;企业数字化转型包括哪些方面&#xff1f; 什么是数字化转型&#xff1f; 百度百科对于数字化转型的定义如下—— 数字化转型&#xff08;Digital transformation&#xff09;是建立在数字化转换&#xff08;Digitization&#xff09;、数字化升级…

98、基于STM32单片机指纹考勤机指纹识别签到系统设计(程序+原理图+PCB源文件+任务书+参考论文+开题报告+元器件清单等)

单片机类型选择 方案一&#xff1a;可以使用现在比较主流的单片机STC89C5单片机进行数据处理。这款单片机具有的特点是内存和51的单片机相比多了4KB内存&#xff0c;但是价格和51单片机一样。并且支持数据串行下载和调试助手。此款单片机是有ATMEL公司生产&#xff0c;可用5V电…

IPC 进程间通讯 (2)

目录 进程间通信的概念 进程间通信的目的 进程间通信的本质 进程间通信的分类 什么是管道 匿名管道 命名管道 system V共享内存 System V消息队列 System V信号量 system V IPC联系 进程间通信的概念 进程间通信简称IPC&#xff08;Interprocess communication&…

赛效:怎么一键人像抠图

1&#xff1a;在人像抠图页面&#xff0c;点击下方的“本地上传”&#xff0c;将本地人像图片添加上去。 2&#xff1a;人像图上传成功后自动进入抠图页面&#xff0c;我们点击下方的“下载图片”&#xff0c;可将抠图后的人像图下载到电脑本地。 3&#xff1a;图片下载成功后&…

OpenCV对图片进行缩放处理

在下面的代码中,我会为你优化和解释这段程序: #include <opencv2/opencv.hpp>using namespace cv;int main() {// 读取源图片Mat srcImage = imread("../51_resize.jpg"

OpenCV使用pyrUp对图片进行放大处理

这段代码使用OpenCV读取图片,然后使用pyrUp函数将图片放大一倍,并显示原图和放大后的图像。以下是优化和注释版本的代码: #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {

亚马逊在日本增设11个配送设施,加强次日达物流网络

据外媒报道&#xff0c;亚马逊计划今年在日本开设11个新的配送设施&#xff0c;以强化其次日达送货服务的范围和提高用户购物的便利性。目前&#xff0c;该电商巨头在日本拥有超过50个配送设施。 亚马逊已经完成了2个&#xff0c;还有9个仍在建造中。该公司表示&#xff0c;它…

C语言柔性数组详解

柔性数组 C99中&#xff0c;结构体中最后一个元素允许是未知大小的数组&#xff0c;这叫做 【柔性数组】成员。 例1&#xff1a; struct node {int i;int num[]; // 柔性数组成员 };例2&#xff1a; struct node {int i;int num[0]; // 柔性数组成员 };柔性数组的特点&…

CMake 笔记

CMake 笔记 CMake 笔记 基础项目多个目录创建项目 链接库 用到的指令实验 使用自定义库 用到的指令实验 指定 C 标准CMake常见变量名 基础项目 实现一个CMakeLists.txt最简单是以下三步&#xff1a; # 最低 CMake 版本要求&#xff1a;指定项目所需的最低 CMake 版本 cma…

<网络编程>网络基础

目录 计算机网络背景 认识“协议”&#xff1a; TCP/IP五层模型 网络传输基本流程 不在一个局域网进行通信 了解网络发展背景&#xff0c;对局域网/广域网的概念认识 了解网络协议意义&#xff0c;重点理解TCP/IP五层结构 学习网络传输的基本流程&#xff0c;理解封装和…

gRPC远程调用协议

gRPC 简介 gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架&#xff0c;基于 HTTP2 协议设计&#xff0c;序列化使用PB(Protocol Buffer)&#xff0c;PB 是一种语言无关的高性能序列化框架&#xff0c;基于 HTTP2PB 保证了的高性能。 HTTP2.0 grpc采用HTTP2.0&…

NFT Insider #100:The Sandbox 展示泰国 2023 年元宇宙生态系统,​游戏巨头世嘉暂缓链游项目开发

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

第三章 数据链路层【计算机网络】

第三章 数据链路层【计算机网络】 前言推荐第三章 数据链路层3.1 数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本问题 3.2点对点协议PPP3.2.1 PPP协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP协议的工作状态 3.3 使用广播信道的数据链路层3.3.1 局域网的数据链路层3.…

ADManager Plus:企业自动化管理的利器

在当今数字化时代&#xff0c;企业管理面临着越来越多的挑战。为了提高效率、降低成本并确保信息安全&#xff0c;自动化管理成为了企业的首要选择。而在众多自动化管理工具中&#xff0c;ADManager Plus无疑是一款卓越的解决方案。本文将为您介绍ADManager Plus的功能与优势&a…

【Accumulate】Gitee解决每次推送输入账户密码问题

【前言】 每次建立私人仓库后&#xff0c;一推送就得输入账户密码&#xff0c;真的巨烦人啊。 【解决】 step1&#xff1a; 绑定私匙&#xff1a; 配置Git_犟小孩的博客-CSDN博客 step2&#xff1a; 每次绑定远程仓库的时候&#xff0c;使用SSH绑定 如果已经绑定过了&…