A-1:树状数组

news2024/11/18 8:55:23

A-1:树状数组

  • 1.介绍
    • Q1:树状数组解决什么问题?
    • Q2:树状数组的使用
      • 1.前置知识:lowbit(x)
      • 2.单点修改
      • 3.求[1,n]的和
      • 4.区间查询
      • 5.hh
    • Q3:树状数组是否优化了
    • Q4:上图上例子解释上面说的东西(Important)
  • 2.习题练习

1.介绍

树状数组是一个比较难以理解的高级数据结构(至少我觉得很难😢)

由于难以理解,所以只好从以下几个方面去理解:

  1. 树状数组用于解决什么问题
  2. 如何去使用树状数组
  3. 树状数组是否优化了算法
  4. 用例子说明

新手不要去死钻“树状数组怎么被总结出来的?树状数组的发明过程”,如果有完美的回答感谢给个链接我去圆梦一下😢

!!对于这个学习,我的看法是先知道什么是树状数组,怎么写,然后根据数据和画图走几遍过程,然后做题。最后再去看数学推导(如果时间充裕的话)。

Q1:树状数组解决什么问题?

预告:数状数组解决”单点修改,区间查询(当然区间也可以是一个点)“问题

首先前缀和是大家都知道的基础算法。假设前缀和数组是 p r e [ n ] pre[n] pre[n],原数组是 a [ n ] a[n] a[n]
p r e [ i ] 表示数组区间 [ 0 , i ] 之和 = a [ 0 ] + a [ 1 ] + a [ 2 ] + . . . + a [ i ] pre[i]表示数组区间[0,i]之和=a[0]+a[1]+a[2]+...+a[i] pre[i]表示数组区间[0,i]之和=a[0]+a[1]+a[2]+...+a[i]
查询区间的时间复杂度是 O ( 1 ) O(1) O(1),比如: 查询 [ i , j ] [i,j] [i,j]之和= p r e [ j ] − p r e [ i − 1 ] = a [ i ] + a [ i + 1 ] + . . . + a [ j ] pre[j]-pre[i-1]=a[i]+a[i+1]+...+a[j] pre[j]pre[i1]=a[i]+a[i+1]+...+a[j],很显然只需要一次操作即可。
重点来了!! 如果修改原数组的一个元素,假设 a [ 0 ] = a [ 0 ] + 1 a[0]=a[0]+1 a[0]=a[0]+1,那么需要 p r e [ 0 ] + 1 pre[0]+1 pre[0]+1 p r e [ 1 ] + 1 pre[1]+1 pre[1]+1 p r e [ n ] + 1 pre[n]+1 pre[n]+1
总结发现,每次修改一个原数组元素,当前元素到数组末尾的所有元素的前缀和都需要改变,那么维护前缀和的时间复杂度是 O ( n ) O(n) O(n),树状数组就是优化掉这个O(n)的大杀器!

总结一下:数状数组解决”单点修改,区间查询(当然区间也可以是一个点)“问题

Q2:树状数组的使用

😱😱😱😱😱

1.前置知识:lowbit(x)

l o w b i t ( x ) lowbit(x) lowbit(x),找x最低位的1及1右边(比1更低位)的所有数的总和,当然最低位1右边全是0

x的十进制数x的二进制数lowbit(x)(换成十进制)
1010102
1110111
1211004
1311011
1411102
1511111
160001 000016

现在应该是了解lowbit做一个什么事情,那么如何实现呢?

void lowbit(x)
{
	return x&(-x);
}

对的,就是这么简单
对数取负表现为 ”除最高位,其余位取反,最低位加1”
来翻译一下: 令x=10
x=1010
-x=1110
x&(-x)=0010

Perfect😋。

2.单点修改

不同于前缀和数组,修改一个点,需要修改O(n)次前缀和区间,而树状数组只需要修改O( log ⁡ 2 n \log_2 n log2n)次
操作为

void add(int i, int y)  //单点修改(同时可以初始化C数组)
{
	for(;i<=n;i+=lowbit(i))
	{
	    C[i]+=y;
	}
}

3.求[1,n]的和

不同于前缀和O(1)次,查询前n个数的和需要O( log ⁡ 2 n \log_2 n log2n)次
操作为

int sum(int i)  //前缀和,求[1,i]的和
{
    int res=0;
	for(;i>0;i-=lowbit(i))
	    res+=C[i];
	return res;
}

4.区间查询

操作为

int Query(int i,int j)  //查询[1,j]区间和
{
	return sum(i)-sum(j-1);
}

5.hh

很显然,已经给出了单点修改,区间查询的操作,且时间复杂度实实在在更低更有效,比单纯使用前缀和好很多。那么有这些知识就可以去写题了。

Q3:树状数组是否优化了

和前缀和相比:

前缀和树状数组
区间查询O(1)O( log ⁡ 2 n \log_2 n log2n)
单点修改O(n)O( log ⁡ 2 n \log_2 n log2n)

当n非常大的时候
1 + n > 2 ∗ ( log ⁡ 2 n ) 1+n>2 *(\log_2 n) 1+n>2(log2n)

Q4:上图上例子解释上面说的东西(Important)

在这里插入图片描述
这个图是 借的,嗯,肯定是借的。
别被误导了!!,C数组不是前缀和,C[4]不是前4个数之和,这个数组单独看没有意义,只有和函数配合使用才有意义!!

现在先抛出问题:需要对数组进行单点修改,区间查询。

现在有数组 A [ 1 ] . . . A [ 8 ] = 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 A[1]... A[8]={1,2,3,4,5,6,7,8} A[1]...A[8]=1,2,3,4,5,6,7,8
先初始化树状数组C,这个数组单独不代表什么,要和其它操作一起才有意义

void add(int i, int y)  //单点修改(同时可以初始化C数组)
{
	for(;i<=n;i+=lowbit(i))
	{
	    C[i]+=y;
	}
}
C[i]+=yi+=lowbit(i),C[i]+=yi+=lowbit(i) ,C[i]+=yi+=lowbit(i),C[i]+=y
C[1]+=1C[2]+=1C[4]+=1C[8]+=1
C[2]+=2C[4]+=2C[8]+=2
C[3]+=3C[4]+=3C[8]+=3
C[4]+=4C[8]+=4
C[5]+=5C[6]+=5C[8]+=5
C[6]+=6C[8]+=6
C[7]+=7C[8]+=7
C[8]+=8
iC[i]
11
23
33
410
55
611
77
836

这就是初始化树状数组,那么先来看查询。
查询 (对照上面的表看,自己琢磨一下)

int sum(int i)  //前缀和,求[1,i]的和
{
    int res=0;
	for(;i>0;i-=lowbit(i))
	    res+=C[i];
	return res;
}
isum(i)
1res=C[1]=1
2res=C[2]=3
3res=C[3]+C[2]=6
7res=C[7]+C[6]+C[4]=28
8res=C[8]=36

2.习题练习

给个链接,兄弟们去刷吧😋
洛谷树状数组题集
Leetcode树状数组题集

洛谷的先做题集里面的模板题

稍后把我的题解搬几个过来。

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

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

相关文章

希亦、追觅、石头洗地机哪一款更实用?爆款产品性能全名测评

洗地机行业正在经历突飞式的发展&#xff0c;各大品牌商家纷纷推出功能丰富、性能卓越的产品&#xff0c;不断升级和优化洗地机的各个方面。如今&#xff0c;洗地机的功能配置已经变得十分完善&#xff0c;为用户提供了更多选择和更优质的清洁体验。那么&#xff0c;洗地机型号…

产品推荐 | 基于Lattice用于原型和FPGA设计和开发的Avant-E 评估板

01 产品概述 莱迪思半导体Avant-E评估板使设计人员能够快速进行原型设计和FPGA设计测试。它提供对所有 I/O 的访问&#xff0c;以及广泛的内存选项&#xff0c;以实现更快的原型设计和开发。 Avant-E评估板采用LFG1156封装的Avant-E FPGA。该板可以通过 FMC HPC、PMAD 和 Ras…

团队协作:如何利用 Gitee 实现多人合作项目的版本控制

文章目录 前言一、名词解释1、Git是什么&#xff1f;2、Gitee、GitHub和GitLab 二、操作步骤1.安装Git2.创建Gitee仓库3.用vscode连接仓库4. 克隆远程仓库 总结 前言 在软件开发中&#xff0c;有效地管理代码是至关重要的。Gitee 是一个功能强大的代码托管平台&#xff0c;提供…

Qt :设置应用的图标

应用不设置图标&#xff0c;怎么都是没灵魂的。 Qt如何设置应用程序图标&#xff0c;一句话搞定&#xff1a; win32: RC_ICONS app.ico本文&#xff0c;笔者 app.ico 文件与pro放到同一级目录。各位可以根据自己的实际情况~

Java -集合-知识点

本文详细介绍了Java中集合的基本概念、常用数据结构和核心特性。通过学习本文&#xff0c;读者可以了解到Java集合框架的核心接口和实现类&#xff0c;掌握各种数据结构在不同场景下的应用方法和优劣势&#xff0c;以及如何使用集合框架提供的方法进行数据操作和处理。同时&…

【MATLAB基础绘图第21棒】绘制比例弦图 (Chord Diagram)

MATLAB绘制比例弦图 Chord Diagram 1 简介1.1 弦图简介1.2 比例弦图简介 2 MATLAB绘制比例弦图2.1 数据准备2.2 基本绘制2.3 添加方向箭头2.4 添加绘图间隙2.5 添加刻度2.6 修改标签2.7 颜色设置2.8 弧块及弦属性设置2.8.1 弧块属性设置2.8.2 弦属性设置 2.9 字体设置 参考 1 简…

手写Java设计模式之工厂模式,附源码解读

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…

11.盛最多水的容器(Java,双指针)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同…

不同条件累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;float result1 0;float result2 0;float result…

如何查找一篇英文文献的源代码?(论文中没有源代码链接时)如何查找一篇论文的实现代码从而复现论文?

有两个网址&#xff0c;从这两个网址里面能找到论文相关代码&#xff0c;但不确定是不是人家论文里的源代码&#xff0c;但是根据论文实在找不到的情况下&#xff0c;只能试试这两个网址了 1. https://paperswithcode.com/ 2. https://www.catalyzex.com/

Java 集合(ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet)【补充复习】

Java 集合&#xff08;ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet&#xff09;【补充复习】 Java 集合概述Collection 接口继承树Map 接口继承树 Collection 接口方法使用 iterator 接口遍历集合元素使用 forearch 遍历集合元素 List 接口List 实…

数据采集技术综合项目实战3(网络爬虫+数据预处理+数据可视化)附带详细步骤说明,干货满满

项目介绍及需求&#xff1a; 本项目主要是通过对b站电影弹幕进行采集并分析。1.获得弹幕高频词生成符合该电影特征、主题、角色等相关字段的词云图&#xff0c;通过词云图的方式对某部电影主题具体化。2.获取用户年内评论发布时间观生成时间的折线图&#xff0c;以便从侧面观察…

【图解计算机网络】从浏览器地址输入到网页显示的整个过程

从浏览器地址输入到网页显示的整个过程 整体流程DHCPhttp协议报文组装DNSTCP协议封装与TCP三次握手IP协议封装与路由表MAC地址与ARP协议交换机路由器 整体流程 从往浏览器输入一个地址到网页的显示&#xff0c;要经过很长的一个流程&#xff0c;中间涉及到计算机网络的许多知识…

【ARM 裸机】I.MX 启动方式之启动头文件 1

接上一节&#xff1a;【ARM 裸机】I.MX 启动方式之启动设备的选择&#xff1b; 2、启动头文件 当 BOOT_MODE1 为 1&#xff0c;BOOT_MODE0 为 0 的时候此内部 BOOT 模式&#xff0c;在此模式下&#xff0c;芯片会执 行内部的 BOOT ROM 代码&#xff0c;这段 BOOT ROM 代码会进…

按钮(秒懂CSS按钮的使用)

目录 一、按钮介绍 1.概念 2.特点 3.功能 二、按钮用法 1.按钮的使用 2.按钮的样式 3.按钮颜色 4.按钮大小 5.圆角按钮 6.按钮边框颜色 7.按钮鼠标悬停 8.按钮阴影 9.禁用按钮 10.按钮宽度 三、按钮实例 1.交互式按钮 2.扩展动画按钮 3.播放/暂停按钮 四、应用场景…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用&#xff1a; 数据交换 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xf…

【JavaSE】浅谈Java异常

前言 本篇文章是对Java异常体系相关内容及部分注意事项的的讲解。 一. 认识异常 在每个人的生命历程中&#xff0c;或多或少都会遇到生病或受伤的情况&#xff0c;比如&#xff1a;皮肤擦伤、感冒、发烧、患上某些传染病等等。不管“病情”严重与否&#xff0c;这些都可以算…

java学习笔记1

1 初识java 1.1 jdk安装 1.1.1 下载jdk https://www.oracle.com/java/technologies/downloads/#java8-windows1.1.2 安装jdk jdk-8u361-windows-x64.exe安装到D:\Program Files\Java\jdk1.8.0_361安装jre,修改地址到D:\Program Files\Java\jre1.8.0_361jdk安装成功1.1.3 配置…

常见的七种排序

目录 一、插入排序 1、直接插入排序 2、希尔排序&#xff08;缩小增量排序&#xff09; 二、选择排序 3、直接选择排序 4、堆排序 三、交换排序 5、冒泡排序 6、快速排序 四、归并排序 7、归并排序 五、总结 一、插入排序 1、直接插入排序 思路&#xff1a; i 用来…

Python革命:如何利用AI数据分析引领人工智能的未来

在人工智能迅速发展的今天&#xff0c;Python语言已经成为了推动AI领域发展的一大利器。作为一种高级编程语言&#xff0c;Python以其简洁的语法和强大的功能&#xff0c;为AI数据分析提供了强有力的支持&#xff0c;帮助开启了人工智能的新时代。 Python的核心优势 Python的最…