二叉堆

二叉堆

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

插入操作

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

删除操作

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

减小某个点的权值

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

建堆

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

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

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

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

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

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

原文地址:https://www.cnblogs.com/fridayfang/p/14705440.html