训练日记-13
2017-08-17 21:53
225 查看
这几天主要在看树状数组的相关学习资料了,树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。
树状数组的基本模版如下:
lowbite操作:
int lowbit(int x)
{
//return x^(x&(x - 1));
return x&(-x);
}
modify操作单点的更新:
void modify(int pos,int sc)//位置pos更新sc
{
while (pos <= n)//由C[N1]到C[Nm]的过程
{
c[pos] += sc;
pos += lowbit(pos);
}
}
getsum操作区间求和:
int getsum(int pos)
{
int sum = 0;
while (pos > 0)//由C[Nm]到C[N1]的过程
{
sum += c[pos];
pos -= lowbit(pos);
}
return sum;
}
树状数组有自身的优越性也有自身的局限性。
其优越性表现为:
1).空间耗费小
2).编程简单
只要开一个数组,所有的操作都可以在十行代码之内实现。没有了繁琐的指针和乱七八糟的二分,编写不容易出错。
其局限性表现为:
1).无法记录一些附加信息(如:不相交区间的个数)
2).树状数组的应用范围狭窄
①求和问题可用
②如果求最大值操作,而且没有删除操作的话
明天再结合题目进一步掌握树状数组这个算法。
树状数组的基本模版如下:
lowbite操作:
int lowbit(int x)
{
//return x^(x&(x - 1));
return x&(-x);
}
modify操作单点的更新:
void modify(int pos,int sc)//位置pos更新sc
{
while (pos <= n)//由C[N1]到C[Nm]的过程
{
c[pos] += sc;
pos += lowbit(pos);
}
}
getsum操作区间求和:
int getsum(int pos)
{
int sum = 0;
while (pos > 0)//由C[Nm]到C[N1]的过程
{
sum += c[pos];
pos -= lowbit(pos);
}
return sum;
}
树状数组有自身的优越性也有自身的局限性。
其优越性表现为:
1).空间耗费小
2).编程简单
只要开一个数组,所有的操作都可以在十行代码之内实现。没有了繁琐的指针和乱七八糟的二分,编写不容易出错。
其局限性表现为:
1).无法记录一些附加信息(如:不相交区间的个数)
2).树状数组的应用范围狭窄
①求和问题可用
②如果求最大值操作,而且没有删除操作的话
明天再结合题目进一步掌握树状数组这个算法。
相关文章推荐
- 训练日记--2017.10.19
- 周中训练笔记13
- 2018年3月11日训练日记
- 2018年3月12日训练日记
- AC日记——严酷的训练 洛谷 P2430
- 2018年3月18日训练日记
- ACM训练日记—3月21日
- 训练日记
- GFOJ2-13 训练
- 2018.3.28 训练日记--备战省赛
- android学习日记13--数据存储之SharedPreference
- 【训练日记】20161028
- ACM训练日记—8月7日
- 训练日记-7
- ACM训练日记—12月31日
- ACM暑假训练日记 17.8.12
- 2012年扑克牌训练日记之一
- ACM训练日记—8月19日
- 2018年1月19日训练日记
- 训练日记-15