都是树的变种,用途不同
【线段树 Interval Tree】
区间管理,是一种平衡树
可看做是对一维数组的索引进行管理。一维数组不需要是排序好的
深度不超过logL
任一个区间(线段)都分成不超过2logL条线段
优点:在O(log L)时间内完成一条线段的插入、删除、查找、求和等
适用于和区间统计有关的问题。但是该问题必须是可以分解成不同子区间的问题的综合
【树状数组】
解决需求:频繁的求某一段之和,并且需要对数组进行动态的增加和删减结点
求和的时间复杂度减低为log N
增删结点的时间复杂度保持为log N (但是常数项可能会很大。如果多次增删结点,可考虑改用线段树)
【树堆】
解决需求:通过“随机”保持排序二叉树的平衡性,保持检索的高效性
类似于排序二叉树
但是结点保存的数据为<key, value>
从key的角度看,是一棵排序二叉树,即,左子节点key<=父节点key <右子节点key
从value角度看,是一个最大堆,即,父节点value >= 子结点value
建树过程:给每个结点赋一个随机的value,先按排序二叉树的插入方法插入,然后调整使之满足最大堆的性质。通过旋转实现。每个结点插入时的时间复杂度为O(lg N),N为已有的节点数
【笛卡尔树】
和数堆很像。但是需求不同,建树过程也不同
解决需求:未知
建树过程:时间复杂度可以为O(N),N为所有的节点数
先按key从小到大排列,然后依次插入树。保留一个数据栈,栈底是根节点,从栈底到栈顶依次是从根节点出来的右子路径。
每次要插入的结点,根据value值找它应该插入的位置。