第25课树状数组.pptxVIP

  • 0
  • 0
  • 约2.64千字
  • 约 20页
  • 2022-07-22 发布于北京
  • 举报
树状数组 线段树的分析 首先我们得知道一个问题,那就是线段树的作用并不只是用来存储线段的,也可以存储点的值等等. 对于静态的线段树,空间上需要的数组有:当前结点的数据值,左儿子编号,右儿子编号.至少这么三个数组. 而在时间上虽然是NlogN的复杂度,但是系数很大. 实现起来的时候编程复杂度大,空间复杂度大,时间效率也不是很理想. 线段树的分析 那么是否有更好的解决方法呢? 有! 那就是树状数组! 线段树的分析 先看一个例题: 数列操作: 给定一个初始值都为0的序列,动态地修改一些位置上的数字,加上一个数,减去一个数,或者乘上一个数,然后动态地提出问题,问题的形式是求出一段数字的和. 线段树的分析 如果直接做的话,修改的复杂度是O(1),询问的复杂度是O(N),M次询问的复杂度是M*N.M,N的范围可以有100000以上 线段树的分析 用线段树可以这样解: 若要维护的序列范围是0..5,先构造下面的一棵线段树: 线段树的分析 可以看出,这棵树的构造用二分便可以实现.复杂度是2*N. 每个结点用数组a来表示该结点所表示范围内的数据之和. 修改一个位置上数字的值,就是修改一个叶子结点的值,而当程序由叶子结点返回根节点的同时顺便修改掉路径上的结点的a数组的值. 对于询问的回答,可以直接查找i..j范围内的值,遇到分叉时就兵分两路,最后在合起来.也可以先找出0..i-1的值和0.

文档评论(0)

1亿VIP精品文档

相关文档