zoukankan      html  css  js  c++  java
  • [算法学习] 线段树,树状数组,数堆,笛卡尔树

    都是树的变种,用途不同

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

  • 相关阅读:
    网络爬虫基础练习
    综合练习:词频统计
    Hadoop综合大作业
    理解MapReduce
    熟悉常用的HBase操作
    第三章、熟悉常用的HDFS操作
    爬虫大作业
    数据结构化与保存
    使用正则表达式,取得点击次数,函数抽离
    爬取校园新闻首页的新闻
  • 原文地址:https://www.cnblogs.com/chenhuanfa/p/3413387.html
Copyright © 2011-2022 走看看