数据结构-第八期——树状数组-原理区间和

news2024/10/6 8:29:35

目录

1、树状数组

2、基本应用

2.1、前缀和:不修改,只查询

2.2、树状数组:动态修改,求区间和

3、实现数组树状

3.1、神奇的lowbit (x)操作

 3.2、tree[ ]数组

3.3、基于tree[ ]的计算 

3.4 sum[]的计算

3.5、tree[]的更新

4、代码演示 


1、树状数组

1.1 简介 

  •  树状数组(Binary Indexed Tree, BIT),利用数的二进制特征进行检索的一种树状结构。
  • 一种真正的高级数据结构:二分思想、二叉树、位运算、前缀和

        树状数组顾名思义就是一个结构为树形结构的数组,于二叉树的结构类似但又不同,它是在二叉树的结构上删除了一些中间节点,如下图所示。

1.2解决什么问题? 

        可以解决大部分区间上面的修改以及查询的问题,例如1.单点修改,单点查询,2.区间修改,单点查询,3.区间查询,区间修改,换言之,线段树能解决的问题,树状数组大部分也可以,但是并不一定都能解决,因为线段树的扩展性比树状数组要强. 

1.3 优缺点:

  1. 算法复杂度:O(logn),高效!
  2. 代码简洁!
  3. 缺点:扩展性弱,线段树能解决的问题,树状数组不一定能解决.

1.4、树状数组和线段树的区别在哪?

        有人会问了既然线段树的问题能够用树状数组解决而且线段树还比树状数组扩展性强,那为什么不直接用线段树呢?问的很好,树状数组的作用就是为了简化线段树,举个例子:一个问题可以用线段树解决写代码半个小时,但是用树状数组只需要10分钟,那么你会选择哪一个算法呢?没错,基于某些简单的问题,我们没必要用到功能性强但实现复杂的线段树(杀鸡焉用宰牛刀).

2、基本应用

数列a_1,a_2,\cdot \cdot \cdot ,a_n,操作:
1)  单点修改:修改元素add(k, x):把a_k加上x。

2)求和:
        sum(x)=a_1+...+a_x
        区间和 a_i+...+a_j=sum(j)-sum(i-1)

2.1、前缀和:不修改,只查询

数列a_1,a_2,\cdot \cdot \cdot ,a_n,求区间和:a_i+...+a_j
数列是静态的,用前缀和计算区间和,特别高效。

  • 前缀和: sum[i]=a+...+ a;
  • 区间和:a;+...+a,= sum[j]-sum[i-1]
  • 查询一次区间和,O(1)

代码演示: 

a = [0,4,5,6,7,8,9,10,11,12,13] # a[0]不用,用0占位
sum = [0]*20
sum[1] = a[1]
for i in range(2,11):   #计算前缀和
    sum[i]=a[i]+sum[i-1]
print(sum)

for i in range(1,11):  #用前缀和反推计算数组a[]:
    print(sum[i] - sum[i-1], end=' ') # a[i] = sum[i] - sum[i-1]
print()
          
print("[5,8]=",sum[8]-sum[4])#查询区间和,例如查询[5,8]

# 输出
# [0, 4, 9, 15, 22, 30, 39, 49, 60, 72, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 4 5 6 7 8 9 10 11 12 13 
# [5,8]= 38

如果数列是动态的

  • 修改元素add(k,x) :把a_k加上x。复杂度O(1)
  • 求区间和:前缀和全部改变,sum(j) - sum(i-1)。复杂度:O(n),效率低。

2.2、树状数组:动态修改,求区间和

数列是动态的

  • 修改元素add(k, x) :把a,加上x。
  • 求区间和:sum(j) - sum(i-1)

复杂度:O(logn)

3、实现数组树状

3.1、神奇的lowbit (x)操作

lowbit(x) = x &-x
功能:找到x的二进制数的最后一个1

&按位与a & b只有当a,b都是1时,a & b=1;否则a & b=0

 以x = 5来举例,-5需要用补码表示

 所以lowbit(5) = 5 &-5 = 1。

 3.2、tree[ ]数组

  • 从lowbit(x)推出tree[门]数组,所有的计算都基于tree[ ]

m = lowbit(x)
定义tree[x]:把a,和它前面共m个数相加

 

 例:lowbit(6)=2,有tree[6] = a_5+ a_6

还可以用下面的方式表示:横线中的黑色表示tree[x],等于横线上元素相加的和。

 

3.3、基于tree[ ]的计算 

 (1)求和 sum=a_1+...+a_x

利用tree[ ]数组求sum,例如:

  • sum[8]= tree[8]
  • sum[7]= tree[7]+ tree[6]+ tree[4]
  • sum[9]=tree[9] + tree[8]

以上关系是如何得到的?        借助lowbit(x)

3.4 sum[]的计算

例: sum[7] = tree[7] + tree[6] + tree[4]

  1. 从7开始,加上tree[7];
  2. 7 - lowbit(7)=6,加上tree[6];
  3. 6 - lowbit(6)=4,加上tree[4];
  4. 4 - lowbit(4)=0,结束。 

 

3.5、tree[]的更新

更改a_x,和它相关的tree都会变化。
例如改变a,,那么tree[3]、tree[4]、tree[8]...都会改变。影响哪些tree[ ]? 仍然利用lowbit(x):

  1. 更改tree[3];
  2. 3+ lowbit(3)=4,更改tree[4];
  3. 4 + lowbit(4)=8,更改tree[8];
  4. 直到最后的tree[n]。

4、代码演示 

def lowbit(x):      # 找到x的二进制数的最后一个1
    return x & -x
def add(x, d):      # 修改x: x加上d
    while x < n:
        tree[x] += d
        x += lowbit(x)
def sum(x):         # 求a_1+.....+a_x
    ans = 0
    while x > O:
        ans += tree[x]
        x -= lowbit(x)
    return ans

引用文章:

树状数组(详细分析+应用),看不懂打死我!  

 

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

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

相关文章

CD3药物研发进展-销售数据-上市药品前景分析

CD3作为近几年的双抗热门靶点之一&#xff0c;目前在全球登记的CD3相关药物就有470个&#xff0c;上市的CD3药物有8款&#xff0c;Ⅰ期临床到Ⅲ期临床有116种&#xff0c;临床前及药物发现达200多种&#xff0c;其火热程度可想而知&#xff0c;笔者为方便大家更加清晰了解CD3在…

ESP-IDF:冒泡排序和选择排序测试代码

ESP-IDF:冒泡排序和选择排序测试代码 /冒泡排序/ void printarry16 (int arr[],int length) { for(int i0;i<length;i) { cout<<arr[i]<<" “; } cout<<endl; } void test16() { int arr[] {9, 8, 7, 6, 5, 4, 3, 2, 1, 0,9, 8, 7, 6, 5, 4, 3, 2…

【笔记】容器基础-容器与虚拟机

杂记&#xff1a; 容器技术的兴起源于 PaaS 技术的普及Docker 公司发布的 Docker 项目具有里程碑式的意义Docker 项目通过“容器镜像”&#xff0c;解决了应用打包这个根本性难题容器本身没有价值&#xff0c;有价值的是“容器编排”进程&#xff1a; 静态表现&#xff1a;程序…

Java NIO同步非阻塞编程原理解析及案例

Java NIO同步非阻塞编程原理解析及案例 文章目录Java NIO同步非阻塞编程原理解析及案例NIO介绍NIO和 BIO的比较NIO 三大核心原理示意图缓冲区(Buffer)基本介绍Buffer常用API介绍Buffer 类及其子类缓冲区对象创建缓冲区对象添加数据缓冲区对象读取数据通道(Channel)基本介绍Chan…

生物医药校招这么难,怎么锁定高端人才?

“每年招聘压力大&#xff0c;进校太难。”“各个事业部人才选用要求高&#xff0c;很难达到要求。”“企业、事业单位、高校三方‘围剿’&#xff0c;人才竞争实在太大&#xff01;”……人才招聘内卷&#xff0c;在生物医药行业可以说是体现得淋漓尽致。生物医药岗位及学历要…

【小白课程】以openKylin看图软件为例,浅谈图片编解码库—FreeImage

看图软件是openKylin操作系统上一款开源的图像查看软件&#xff0c;支持对图片进行基本操作,如&#xff1a;缩放、翻转、详情查看、复制、打印、重命名等&#xff0c;同时还可以对图片进行裁剪、存储、标注和ocr&#xff08;文字识别&#xff09;。 图1 看图软件界面 作为图像…

信通院联合偶数科技等企业发布《云原生湖仓一体白皮书》

2023年1月9日&#xff0c;云原生产业联盟在今年年会上重磅发布了《云原生湖仓一体白皮书》。该白皮书由中国信通院牵头&#xff0c;偶数科技、中国人寿、中信建投、中国联通等单位共同编写。 本次白皮书从云原生湖仓的发展历程、技术方案、生态现状、实践案例等方面进行了全面深…

Linux C 捕捉 Ctrl+C 的SIGINT信号

kill -l可以看每个数字对应的信号信号值9和15的区别&#xff1a;kill命令默认是-15&#xff0c;代表的信号为SIGTERM&#xff0c;在结束此进程之前&#xff0c;允许此进程做一些清理工作kill -9会直接杀死目标进程&#xff0c;不给其机会做清理工作按键盘的 CtrlC时&#xff0c…

测试高薪必备

测试人员由于工作原因要经常检查数据库的数据是否正确&#xff0c;这个时候就需要频繁使用多表查询。 在多表查询中&#xff0c;应用最多的就是内连接&#xff0c;其次就是子查询。 为什么子查询是在工作中应用也有这么广泛的应用呢&#xff1f;原因在于子查询非常方便…

macOS下使用vscode+xdebug调试php

手动安装xdebug1、浏览器访问https://xdebug.org/wizard2、在本地终端输入php -i 命令&#xff0c;将输出的内容复制到指南中的输入框中并提交分析3、分析完后会给出分析概览&#xff0c;然后根据下面提示步骤进行手动安装即可第5步中的phpize 命令位置:/usr/local/Cellar/php7…

神经网络基础与原理

7.1 神经网络基础与原理 学习目标 目标 了解感知机结构、作用以及优缺点了解tensorflow playground的使用说明感知机与神经网络的联系说明神经网络的组成说明神经网络的分类原理说明softmax回归说明交叉熵损失应用 无 7.1.1 神经网络 人工神经网络&#xff08; Artificial N…

Oracle数据库卸载安装

卸载oracle步骤&#xff1a;1.首先关掉所有oracle的相关服务&#xff0c;然后找到oracle的卸载程序Universal Installer&#xff1a;2.卸载&#xff0c;删除所有应用然后继续点击卸载产品&#xff0c;然后点击展开全部&#xff0c;将主目录以外的所有应用全部卸载掉&#xff0c…

【C语言】C语言中a<b<c与a<bb<c的区别你注意到了嘛?

问题导入   今天碰到了一个if(a<b<c)逻辑一直成立&#xff0c;无论a,b,c三者的值如何&#xff0c;输出结果一直一样。&#x1f605;&#x1f605;&#x1f605;大家可以看看下图&#xff1a; 逻辑运算测试1 不过讲实话&#xff0c;在实际写代码过成中&#xff0c;小编一…

【数据结构基础】树 - 哈夫曼树(Huffman Tree)

哈夫曼又称最优二叉树, 是一种带权路径长度最短的二叉树。(注意带权路径WPL是指叶子节点&#xff0c;很多网上的文章有误导) 哈夫曼树相关名词先看一棵哈夫曼树: (哈夫曼树推理是通过叶子节点&#xff0c;所以理解的时候需要忽略非叶子节点&#xff0c;很多文章在这点上有误导)…

CHAPTER 14 Swarm

Swarm14.1 Swarm简介14.2 Swarm vs K8s14.3 基本概念1. Swarm集群2.节点3.服务4.任务5.服务的外部访问14.4 使用Swarm1.创建集群(init)2.查看集群信息(info)3.加入集群(join)4.使用集群服务(service)1. 创建服务(service create)2. 查看服务(service ls)3. 扩缩服务(service sc…

力扣:至少是其他数字两倍的最大数(详解)

前言&#xff1a;本期是关于至少是其他数字两倍的最大数的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 给你一个整数数组 nums &#xff0c;其中总…

如何对企业网站进行优化?(网站怎样优化seo)

探析企业网站优化怎么做才有效果&#xff1f; 在互联网营销时代&#xff0c;搜索引擎一直是推广流量的重要途径&#xff0c;越来越多的企业已经涉足搜索引擎优化行业&#xff0c;众多企业做网站优化是为了网站提升企业知名度和流量&#xff0c;争取以更低成本做更高转化、更快…

公务机包机|公务飞行包机攻略解答

公务机是一种在行政事务和商业活动中用作交通工具的飞行&#xff0c;也被称为行政机或商用飞机。公务机包机程序简单&#xff0c;不仅可以享受不一致的尊崇服务&#xff0c;而且可以避免巨额投资和日常管理的繁琐事务。    公务机是指在行政事务和商业活动中用作交通工具的飞…

最重要的定理:隐函数定理

多元函数变限积分求导问题

整理网上拷贝的文档格式-去掉代码前的序号

1、整理换行 第一步&#xff0c;将所有的纯换行的地方替换为空&#xff08;也就是删除他们&#xff09;&#xff0c;我这里是将选择题的各选项之间的换行替换为两个制表符&#xff08;两个Tab键&#xff09;&#xff1a; 执行这一步的时候注意将通配符的选项勾选上&#xff0c…