线段树
查找树是用来查询数据本身是否存放的结构,线段树就是用来查询数据的聚合结果的结构。
概述
线段树的非叶子节点都是区间,而叶子节点是原始数据本身。非叶子节点中经常存放着叶子节点的聚合数据,例如最大值,最小值,数量值等等。
由于线段树的区间只跟数据的数值范围有关,不跟数据有关。所以线段树的高度最大为log(数值范围)。
例如存放int值的线段树,高度最大为log(INT_MAX)
作用
包含查找树的所有功能
- 快速查找元素是否存在,log(n)
- 快速查找树中的最大值或最小值,log(n)
- 快速计算树中的聚合操作,像max,min,count,sum,中位数等等。log(n)
- 快速批量设置区间的数值,并维护上述性质不变。log(n)
优化
一般的线段树是静态的,就是数据量是固定的,只能修改数据,不能增删数据,这时的线段树是数组实现的。
- 动态线段树,链式实现,支持增删数据,并保持功能不变。
- 多维线段数,实现多维空间的查找操作。
- ZKW线段树,线段树的数组实现,在数组上建立满二叉树的方法,在保持时间复杂度不变的情况下,降低了运行常数。
- 树状数组,特殊的线段树,专门用来计算区间的sum,max,min值等等,不能中间删除数据,只能增加或减少数据。
- 单调队列,特殊的线段树,专门用来计算区间的max和min值,不能修改数据,只能前删或后删数据,增加数据,区间只能是大于或少于某个数值。经常用来查询“少于N的max(k)”的问题,常用于DP优化。