线段树(区间树,segment tree)
线段树是一颗平衡二叉树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。
时间复杂度:
操作 | 数组 | 线段树 |
---|---|---|
更新 | O(n) | O(log n) |
查询 | O(n) | O(log n) |
如果区间有N个元素,数组需要多少个结点?
分析:如果N=2^K, 总共是K层,需要2N的空间;
如果N=(2^k)+1,总共是K+1层,第K+1层需要大于等于N,则K+1层容量是2N,线段树需要4N的空间。
总而言之就是,线段树容量为最后一层容量的二倍。因此,创建线段树数组时容量为4N。
代码如下:
创建线段树
public class SegmentTree<E> {
private E[] tree;
private E[] data;
private Merger<E> merger;
public SegmentTree(E[