一、原理
简介:
假设有编号从1到n的n个点,每个点都存了一些信息,用[L,R]表示下标从L到R的这些点。
线段树的用处就是,对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是O(log2(n))。线段树的原理就是,将[1,n]分解成若干特定的子区间(数量不超过4*n,),然后,将每个区间[L,R]都分解为少量特定的子区间,通过对这些少量子区间的修改或者统计,来实现快速对[L,R]的修改或者统计。
结构:
对于A[1:6] = {1,8,6,4,3,5}来说,线段树如下所示,红色代表每个结点存储的区间,蓝色代表该区间最值。
注:最下一排的下标直接从9跳到了12,原因是已经开了两个空间,虽然没有使用,这也是为什么无优化的线段树建树需要2*2k(2k-1 < n < 2k)空间,一般会开到4*n的空间防止RE。
假设原数组为a,长度n=a.length,则线段树数组为t,长度为4*n;其中t[k]表示编号为k的区间内的最大值,如上图t[2]表示编号为2的区间[1,3],最大值为8;
主要代码:
public class segmentTree {
//原数组长度
private int len=10005;
//定义原数组和线段树数组
int[] a=new int[len],t=new