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


    都是树的变种,用途不同

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

  • 相关阅读:
    Java文件输入输出
    数位dp
    https://www.luogu.org/blog/An-Amazing-Blog/mu-bi-wu-si-fan-yan-ji-ge-ji-miao-di-dong-xi
    洛谷
    洛谷
    洛谷
    Java简单高精度合集
    洛谷
    洛谷
    洛谷
  • 原文地址:https://www.cnblogs.com/chenhuanfa/p/3413387.html
Copyright © 2020-2023  润新知