zoukankan      html  css  js  c++  java
  • 二叉堆

    二叉堆

    以大顶堆为例, 树根是最大元素, 左右子节点都比父节点小

    插入操作

    最简单的方法就是在最下一层的最右边的叶子节点插入; 插入后可能不满足性质,需要向上调整

    删除操作

    删除根节点
    但如果直接删除会形成两个堆,通常采用的做法是把根节点和最后一个节点直接交换,直接删除最后一个节点
    但根节点可能不满足性质,需要向下调整;在该节点的儿子中找一个最大的与该节点交换

    减小某个点的权值

    减小权值后,向下调整一次即可; 增加权值后,向上调整

    建堆

    直接采用向上调整的复杂度是是O(nlogn)

    但如果从叶子节点逐个向下调整,时间复杂度是O(n),推导可见下面:

    1. 主要思路可以简单从满二叉树(2^k-1 = n)的情况下推到
    2. 转化成等比数列的求和的求导形式,在求和之后再进行求导
    3. 最后的复杂度是O(n)

    根据上面的介绍,二叉堆的插入操作是插在尾部然后向上调整;删除操作是将头节点与尾部节点交换后,对新的的根节点进行向下调整

    更改权值则需要视情况进行向下或者向上调整

    建堆如果从叶子节点导根节点的依次向下调整时间复杂度可以降到(O(n))

  • 相关阅读:
    powershell查看pc信息的常用命令
    OSPF_Network-type
    redistribute and Suboptimal routing
    redistribute_prefix
    分发列表
    自增和自减
    逻辑运算
    判断闰年
    XenApp简单部署
    使用git将本地文件提交到github存储库
  • 原文地址:https://www.cnblogs.com/fridayfang/p/14705440.html
Copyright © 2011-2022 走看看