树状数组----构建与基本操作
来源:互联网 发布:酒店清洗床单 知乎 编辑:程序博客网 时间:2024/05/23 01:17
树状数组
树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值。// 借来了百度上的定义
lowbit
int lowbit(int n) { return n&(-n);}// ‘&’为按位取反 // lowbit可取得n二进制下最后一位‘1’代表的数字大小
示意图
![图1](http://img.blog.csdn.net/20160709231925075)![图2](http://img.blog.csdn.net/20160709231948150)
性质
如示意图,树状数组的每一层的lowbit值相等,且lowbit值越大,越接近根。对于节点i,如果他是左子节点,那么他的父节点的编号为i+lowbit(i);如果他是右子节点,那么他的父节点的编号是i-lowbit(i);如图一每一个C[i]所代表的空间是白条的所覆盖的所有A[n];
构建
树状数组的构建
for(int i = 1; i <= n; i++) cin >> A[i]; for(int i = 1; i <= n; i++) for(int j = i-lowbit(i); j <= i; j++) C[i] += A[j]; // A[i]用于储存原始变量 // C[i]为树状数组
基本操作—add
void add_num(int x, int d) { while (x <= n) { C[x] += d; x += lowbit(x); }}//顺着节点C[x]开始往左走,边走边“往上爬”(无需沿着树的边),将经过的所有的C[i]的值相加
基本操作—sum
void add_num(int x, int d) { while (x <= n) { C[x] += d; x += lowbit(x); }}//顺着C[x]开始往右走,边走边“往上爬”(无需沿着树的边),将经过的所有的C[i]点的数据进行修改
0 0
- 树状数组----构建与基本操作
- 树状数组基本操作
- 树状数组的基本操作
- 树状数组(基本操作)
- POJ 2309 BST 树状数组基本操作
- 1001(树状数组基本操作的合集)
- 基本二维树状数组
- 哈夫曼树的基本构建与操作
- 哈夫曼树的基本构建与操作
- [树状数组]操作数列
- 树状数组的基本函数
- 树状数组的基本写法
- 树状数组的基本运用
- 树状数组的一系列操作
- [POJ3468] 区间操作 - 树状数组
- 树状数组区间操作模板
- Mobius反演与树状数组
- 线段树与树状数组
- Android使用intent跳转到其它应用activity界面
- Leetcode no. 41
- The Values You Can Make
- LRU Cache
- Android启动过程深入解析
- 树状数组----构建与基本操作
- Balanced Lineup(线段树——根据区间找最值)
- UITableView错题集
- m_pDC->GetSafeHdc()的思考
- mysql++ 官方文档阅读简略摘要
- PHP调用OpenOffice实现word转PDF
- IOS 最强大的模糊搜索
- Android6.0给开发者带来哪些影响
- XML基础