二叉堆
二叉堆
以大顶堆为例, 树根是最大元素, 左右子节点都比父节点小
插入操作
最简单的方法就是在最下一层的最右边的叶子节点插入; 插入后可能不满足性质,需要向上调整
删除操作
删除根节点
但如果直接删除会形成两个堆,通常采用的做法是把根节点和最后一个节点直接交换,直接删除最后一个节点
但根节点可能不满足性质,需要向下调整;在该节点的儿子中找一个最大的与该节点交换
减小某个点的权值
减小权值后,向下调整一次即可; 增加权值后,向上调整
建堆
直接采用向上调整的复杂度是是O(nlogn)
但如果从叶子节点逐个向下调整,时间复杂度是O(n),推导可见下面:
- 主要思路可以简单从满二叉树\(2^k-1 = n\)的情况下推到
- 转化成等比数列的求和的求导形式,在求和之后再进行求导
- 最后的复杂度是O(n)
根据上面的介绍,二叉堆的插入操作是插在尾部然后向上调整;删除操作是将头节点与尾部节点交换后,对新的的根节点进行向下调整
更改权值则需要视情况进行向下或者向上调整
建堆如果从叶子节点导根节点的依次向下调整时间复杂度可以降到\(O(n)\)