给定一个长度为n(n<=105),初始时都为0的序列A,有m(m<=105)次操作,每次可以进行如下两类操作:
(1).Add i d:表示将序列第i个数加上d;
(2).Ask s t:询问序列s到t的所有数的和;
•问如何设计算法,使得修改和询问操作的时间复杂度尽量低?
【题目分析】
■如果直接用数组模拟,那么修改是O(1),查询是O(n),总的时间复杂度为O(nm);
■如果维护另一个数组b[i],表示a[1]到a[i]的和,那么修改是O(n),查询是O(1),总的时间复杂度为O(nm);
■一个程序的时间复杂度取决于其中最大的时间复杂度。
■树状数组的目的就是平摊修改和查询的时间,使复杂度由O(n)降到O(logn)。 ————————————————
版权声明:本文为优快云博主「moep0」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/moep0/article/details/52770728
树状数组的基本原理还算是比较好理解
当数的范围比较大时需要进行离散化,即先排个序,再重新编号。如a[] = {10000000, 10, 2000, 20, 300},那么离散化后a[] = {5,
1, 4, 2, 3}。
另外,博客有些地方写的比较简陋,看不懂,唉
可惜参考书不在身边
唉,好乱,这东西到底该怎么学啊