首页 > 其他分享 >树状数组!!!!!!!!

树状数组!!!!!!!!

时间:2024-07-25 22:57:01浏览次数:10  
标签:树状 二进制 lowbit 数组 区间 节点

发明这个的人真的变态啊!!!!!!!!!!

一,概念

树状数组是一种基于二进制思想的数据结构,基本用途是维护序列的前缀和。

对于给定的序列a,设树状数组为c,则c[x]保存序列a的区间[x-lowbit(x)+1,x]中所有数的和

二,lowbit()操作

 作用:求一个数字二进制的第一个为1的位置和后面的0构成的数值

 操作:让这个数与它的相反数&,即:n&(-n)

原理:

三, 使用条件

基本操作(稍后会讲)

1,单点查询,求前缀和,a中区间[1,x]的所有数的和

2,修改某一个数的值

时间复杂度o(log n)

扩展操作

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

四,树状数组

将一个整数用二进制分解

 将它分为每一个小的的区间

如图:

看来看去,感觉我刚开始卡的就是c的含义,理解了这个后再去看y总的视频,就很轻松了

1,c 的含义

cx表示以x为结尾,长度为2^k的区间和

也可以说:

c|x|维护的是序列a的区间[x-lowbit(x)+1,x]和

2,c 的值

c(x)=a(x)+c(x-1)+c(x-1-lowbit(x-1))+.....(一直到零为止)  

(就是先变为11111...,然后不断减去后面的二进制里面的1)

 3,子结点个数

每个c(x)的子结点个数是lowbit(x)的位数

这个很容易证明

假设有一个为10010的数,它的子节点可以为00001,10010‘

4,寻找父节点’

很明显,每个cx的直接父节点,都是该数字的最高位1的前一位变为1,剩下的都变为0.

例如:

 x=4时,4=0100,它的父节点为1000

而且这个父节点是唯一的,只能是这个形式

故求父节点为 x+lowbit(x)   

相当于让这个数从最低位开始,进一位

五,两大基本操作

标签:树状,二进制,lowbit,数组,区间,节点
From: https://blog.csdn.net/ljq324/article/details/140658610

相关文章

  • C语言知识大闯关之二维数组与变长数组
    目录引言1.二维数组的创建1.1二维数组的概念1.2二维数组的创建2.二维数组的初始化2.1不完全初始化2.2完全初始化2.3按照行初始化2.4初始化时省略行,但不可以省略列3.数组的使用3.1二维数组的下标3.2二维数组的输入和输出二维数组在内存中的存储4.C99中的变长数组引......
  • JavaScript(数组)
    今天学习了数组,最为重要的就是数组方法,其次就是遍历,这在作业中用的是最多的。学完发现用数组方法完成作业,比用循环写代码量要少很多。作业1:定义一个数组[1,5,6,99,5,66,7,4,1,6,9]去掉数组里面的重复值(两种方法)第二种方法因为set不明白所以打了注释(借鉴了......
  • js中 数组和Object的keys(),values()和entries()方法
    ES6提供三个新的方法——entries(),keys()和values()。它们都返回一个遍历器对象,可以用for…of循环进行遍历,区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历.1.数组的keys()和values()还有entries()方法letarr=['a','b','c']for(let......
  • 数据结构-2. 动态数组1
    动态数组设计structdynamicArray{ void**pAddr;//维护真实在堆区创建的数组的指针 intm_capacity;//数组容量 intm_size;//数组大小};数组初始化structdynamicArray*init_DynamicArry(intcapacity){ if(capacity<=0) { returnNULL; } //给数......
  • Java入门:05.Java中的数组002
    通过上篇文章,相信大家对数组应该有了一个简单的了解,并对Java中的数据类型有了一个基本的认识,不仅如此我们还明白了怎样定义一个数组类型的变量,在这之后,让我们一起来更加深入的了解一下数组吧。三、如何创建一个数组(对其初始化)上篇文章我们明白了怎样定义一个数组类型的变量,但......
  • C语言---二维数组
    1.1概念        从逻辑上有行有列的数组,成为二维数组,相对来讲,只有行这种单一线性结构的数组称为一维数组。二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。定义由行和列组成的二维表格形式元素,二维数组其实也就是矩阵基本格式。访问二维数组需要两个值......
  • C++自学笔记15(数组)
    指针是C++中数组的工作方式,没有指针基础可以看笔记6。数组就是一堆变量的集合,有没有感觉与结构体很相似?让我们来考虑下在结构体中我们仅仅是定义了几个变量例如定义x,y坐标与speed速度。如果我们需要64个变量表示某个东西的64种状态,那么你会看到inta0=0;inta1=1;inta2......
  • C语言:数组
    hello,大家好今天我们来讲解c语言中数组的知识。一、数组的概念数组是⼀组相同类型元素的集合;数组中存放的是1个或者多个数据,但是数组元素个数不能为0。数组中存放的多个数据,类型是相同的。数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。二、一维数组 1......
  • JavaScript的数组方法
    JavaScript中的数组是高阶的、灵活的数据结构,提供了许多内置方法来操作数组。以下是一些常用的数组方法:1.数组的添加、删除和替换方法:push(...items):向数组末尾添加一个或多个元素,并返回新的长度。pop():移除数组的最后一个元素,并返回被移除的元素。unshift(...items):向数组......
  • c语言--数组详解
    数组的概念数组是一组相同类型元素的集合;从这个概念我们就可以发现2个有价值的信息:数组中存放的是1个或多个数据,但是数组的元素不能为0。数组中存放的多个数据,类型是相同的。数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。一维数组1.一维数组的创建和初......