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

都是树的变种,用途不同

【线段树 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值