线段树之入门篇
线段树 (interval tree) 是把区间逐次二分得到的一树状结构。它反映了包含归并排序在内的非常多分治算法的问题求解方式。 上图是一棵典型的线段树。它对区间[1,10]进行切割。直到单个点。这棵树的特点 是: 1. 每一层都是区间[a, b]的一个划分。记 L = b - a 2. 一共同拥有log2L层 3. 给定一个点p。从根到叶子p上的全部区间都包括点p。且其它区间都不包括点p。 4. 给定一个区间[l; r],能够把它分解为不超过2log2 L条不相交线段的并。 当中第四点并非非常显然。图8.1显示了[2, 8]的分解方式,深灰色结点为分解后的 区间,浅灰色结点是递归分解过程中经过的结点。 为了叙述方便,以下称树中的结点 所相应的区间为树中区间。 从第3点和第4点能够得出结论:改动一个点仅仅用改动log2 L个树中区间信息。而统计一个区间仅仅须要累加2log2 L个树中区间的信息,且訪问的总结点数是O(log L)的。 两个操作都非常easy实现。 动态统计问题I 有一个包括n个元素的整数数组A,每次能够改动一个元素,也能够询问某一个区间[l; r]内全部元素的和。怎样设计算法,使得改动和询问操作的时间复杂度尽量低? 方法一 直接做, 则改动操作是O(1)的, 但询问须要进行累加, 时间复杂度为O(r ¡ l),最坏情况为O(n)。 方法二