[算法学习] 线段树,树状数组,数堆,笛卡尔树

都是树的变种,用途不同

【线段树 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值找它应该插入的位置。

原文地址:https://www.cnblogs.com/chenhuanfa/p/3413387.html