线段树基本概念

 
    线段树是一棵二叉树(但不一定是完全二叉树!),它的每个节点均代表一个区间,且父节点代表的区间为左右子节点代表的区间之和。特别的,根节点代表的区间为所有节点代表区间之和,各个叶节点代表区间为单个点(即长度为1的区间)。

线段树结构

线段树和区间

 
(3)区间分解时,每层最多2个“终止”节点,所以“终止”节点的总数也是 log(n)量级的

线段树性质

  1. 线段树为二分构造,若根节点对应区间为[a,b],则其深度为 )(向上取整)。这样在进行更新查询操作的时候,操作的复杂度就可以为log(n)量级
  2. 叶子节点的数目和根节点表示的区间长度相同
  3. 若叶子节点的数目为N,则线段树的总节点数目为2*N-1。因为线段树的节点要么是0度,要么为2度,根据二叉树的性质可知。
  4. 若叶子节点为N,要想用连续的数组表示一棵线段树,则数组的大小应该为4N。 
       因为,根据性质3,线段树总节点数目为2*N-1,又由于线段树不是完全二叉树,因此其最低的叶子一层并不是紧靠最左边,这样在其倒数第二层上的索引号接近2N的位置,按照2*index+1和2*index+2的方式来访问其左右子节点,这就导致整个数组的大小要约为 4*N.
  5. 线段树上,任何一个区间被分解后得到的“终止”节点的数目都是log(n)量级。 
         因为每一层最多有两个“终止”节点,共log(n)层,这样在线段树上进行更新叶子节点和进行区间分解的时间复杂度都是O(logn).

线段树操作的基本类型

 
(4)扫描线

线段树解题的一般规律

  1. 首先要确定是一个区间的问题,如果不是明显的区间,看是否能转化为区间。例如 poj_3321的解答
  2. 要想清楚每个节点要存放哪些信息(当然,区间的起始和终止节点,以及左右子节点指针是必须的)
  3. 更新的时候,看是否能够lazy更新,即不要一下就更新到叶子节点,这样会导致更新效率降低
  4. 先建树,然后插入数据,再更新/查询

其他

线段树总结2

相关文章:

  • 2021-04-21
  • 2021-05-31
猜你喜欢
  • 2021-12-05
  • 2021-11-07
  • 2022-12-23
  • 2021-09-10
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案