向下调整算法:
这里需要用到满二叉树的一些性质:
1.假设树的高度为h,根节点视为第一层,则第h层节点的个数为
2.此二叉树总结点个数N=
,则
为了保证每次调整后,已经调整过的部分不被打乱,我们需要从倒数第二层开始调整,最坏的情况就是每个节点都向下调整了
-1次(
表示以该节点为根节点的子树的高度),设向下调整的总次数为关于h的函数F(h),则F(h)表示如下:
F(h)=
利用错位相减法,求F(h)很容易:
则:F(h)=
,利用上面的性质2,可得T(N)=N+1-1-
T(N)=N-
因为要计算时间复杂度,所以我们要逐步去掉影响不大的部分:
T(N)=N-
又当N足够大时,
与N相比,可以忽略不计
故向下调整算法时间复杂度:O(N)
向上调整算法:
为了保证每次调整后,已经调整过的部分不被打乱,我们需要从第二层开始调整,最坏的情况就是每个节点都向上调整了
-1次(
表示以该节点所在的层数),设向上调整的总次数为关于h的函数F(h),则F(h)表示如下:
F(h)=
则:F(h)=2-
+
=2+
T(N)=2+(N+1)*
因为要计算时间复杂度,所以我们要逐步去掉影响不大的部分:
故向上调整算法时间复杂度:O(N*
)
结论:
向下调整算法时间复杂度:O(N)
向上调整算法时间复杂度:O(N*logN)
其实在写出调整次数的式子时我们就已经可以得出结论了,对于向下调整算法,层数越高的结点,需调整的次数越少,而层数越高结点越多,也就是大多数结点只需要调整少次,而向上调整算法恰恰相反,大多数结点需要调整多数次,而基于满二叉树结构的特点,我们发现最后一层节点数占总结点数的几乎一半,对于最后一层的调整次数对整体影响很大,因此我们需要让最后一层调整少次,对应以上过程,我们选择向下调整算法更优。