2017.8.31

来源:互联网 发布:数据库原理范式 编辑:程序博客网 时间:2024/06/01 18:19

    线段树就是一种二叉树,开始不懂为啥还要分成左右子树,后来一个图清晰了然:


这个图的作用就是对子区间的划分,从而求和简单,跟树状数组的方法没一点联系,但是目的是一样的,都是为了计算方便简单。

首先是讲原始子区间的分解,假定给定区间[L,R],只要L < R ,线段树就会把它继续分裂成两个区间。
首先计算 M = (L+R)/2,左子区间为[L,M],右子区间为[M+1,R],然后如果子区间不满足条件就递归分解。
这是整个图的精髓

关于数组的大小,可以这么想:

实际上足够的空间 =  (n向上扩充到最近的2的某个次方)的两倍。
举例子:假设数组长度为5,就需要5先扩充成8,8*2=16.线段树需要16个元素。如果数组元素为8,那么也需要16个元素。
所以线段树需要的空间是n的两倍到四倍之间的某个数,一般就开4*n的空间就好,如果空间不够,可以自己算好最大值来省点空间。

用数组表示二叉树的方法:

假设某个节点的编号为v,那么它的左子节点编号为2*v,右子节点编号为2*v+1。

然后规定根节点为1.这样一颗二叉树就构造完成了。通常2*v在代码中写成 v<<1 。 2*v+1写成 v<<1|1 。
目前就理解到这里,这是最基础的。
说实话,这四天挺对自己不负责任的,一直没有好好看,这周六周末时间也安排的比较紧,但一切都没有学习重要,学习如逆水行舟,不进则退,在acm上体会也很深。所以对自己的努力负责吧,对自己前几天的表现做一个批评。一切都不算理由。