树状数组算法分析
2017-07-31 19:59
232 查看
最近经常碰到树状数组的问题, 就不如写一写对这个算法的理解吧;
先偷一张图:
大概理解就是, 对于 c[]数组 是整个树状数组里的灵魂, 也可是tree[] 数组, 其实A[] 数组 是不存在的(可以这么理解 ) 借势,
C[8]= C[4] + C[6] + C[7] + A[8]
而 C[4] = C[2] +C[3] + A[4]
C[6] = C[5] + A[ 6]
对于 从 8 -4-6-7 这些数 经历的变化 用k 来表示, 二进制啥的 一系列转化
变成这个: k&(-k);
K 在变化, 但是变化的工程中就把所有的都访问了, 一级管一级的意思,
树状数组维护:
'void add(int k,int num)//维护添加值
{
while(k<=2*n)
{
tree[k]+=num;
k+=k&(-k);// lowbit(k)= k&(-k);
}
}
求 区间[1-x]的和
int Sum(int x)//求区间[1,x] 的和
{
int sum=0;
while(x)
{
sum+=tree[x];
x-=x&(-x);
}
return sum;
}求 x - y 的和
一般 的用法, 如果 我要求 x-- y 之间 的数值和, 我可以 先对add(y,1); 使 y 前面的 都 +1; 然后add(x,-1); 对x 前面的都-1 然后 x ,y 之间的 就是结果
先偷一张图:
大概理解就是, 对于 c[]数组 是整个树状数组里的灵魂, 也可是tree[] 数组, 其实A[] 数组 是不存在的(可以这么理解 ) 借势,
C[8]= C[4] + C[6] + C[7] + A[8]
而 C[4] = C[2] +C[3] + A[4]
C[6] = C[5] + A[ 6]
对于 从 8 -4-6-7 这些数 经历的变化 用k 来表示, 二进制啥的 一系列转化
变成这个: k&(-k);
K 在变化, 但是变化的工程中就把所有的都访问了, 一级管一级的意思,
树状数组维护:
'void add(int k,int num)//维护添加值
{
while(k<=2*n)
{
tree[k]+=num;
k+=k&(-k);// lowbit(k)= k&(-k);
}
}
求 区间[1-x]的和
int Sum(int x)//求区间[1,x] 的和
{
int sum=0;
while(x)
{
sum+=tree[x];
x-=x&(-x);
}
return sum;
}求 x - y 的和
int Get_sum(int y,int x)// x-y区间的和 { return Sum(y)-Sum(x); }
一般 的用法, 如果 我要求 x-- y 之间 的数值和, 我可以 先对add(y,1); 使 y 前面的 都 +1; 然后add(x,-1); 对x 前面的都-1 然后 x ,y 之间的 就是结果
相关文章推荐
- 树状数组算法分析
- 计算KMP模式匹配算法中next数组的代码分析及改进型KMP算法中nextval数组代码分析
- 【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵
- 【算法与实现】线段树&树状数组(下)
- 树状数组 小白算法学习
- 2018年全国多校算法寒假训练营练习比赛(第五场) Big Water Problem(树状数组)
- 1.[数据结构和算法分析笔记]数组
- [算法设计与分析]3.2.3数组记录状态信息(互不相同的9位数+圆圈报数游戏)
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- BZOJ3236 作业 [莫队算法][树状数组]
- PHP实现找出有序数组中绝对值最小的数算法分析
- 逆序对的两种算法【树状数组 / 归并排序】
- Codeforces-Round 174(Cows and Sequence)(树状数组、高校算法)
- 求两个数组的交集、并集和差集算法分析与实现
- 关于数组方面的算法分析
- 【算法】逆序对问题的四种解法(归并排序,BST,树状数组,线段树)及变形
- 数组插入算法的分析与理解
- 第 2 章 第 4 题 几种数组旋转算法效率分析
- Golang算法问题之数组按指定规则排序的方法分析
- 算法--数组冒泡排序和选择排序原理分析