一、前言
在上一篇文章中,我们讲了向下调整建堆。这一篇中,我们将来分析它的时间复杂度,以及向上调整建堆的时间复杂度。
二、向下调整建堆的时间复杂度分析
1.图解
注意:时间复杂度算的是最坏的情况,也就是每一个结点都需要向下调整到最后一层,最后一层不需要向下调整。
2.计算
3.系数替换
堆是完全二叉树,为了方便计算,我们这里用了满二叉树来总结(结果相差不大)。满二叉树的结点和高度满足以下关系。
将上述的T(n)换成T(N)有:
所以时间复杂度为O(N)。
(为什么要将T(n)换成T(N),因为N是结点的个数,而我们计算的是每个结点被操作的次数之和,所以结点越多,时间越长,此处,结点是时间复杂度的变量。)
三、向上调整建堆的时间复杂度分析
向上调整堆栈和向下调整是相似的,但是时间复杂度却有很大区别。向上调整的代价要大的多。
1.图解
由图分析,向上调整算法,越往下结点越多,而要调整的层数也越多。所以,向上调整算法的时间复杂度肯定是要大于向下调整算法的。
2.计算
2.系数替换
时间复杂度为:
四、总结
通过对事件复杂度的分析,向下调整算法优于向上调整。所以建堆优先选择向下调整算法。
下一篇写堆求Top-k(用堆实现数据的最大K个排序问题)