建堆的时间复杂度详解

接上之前堆的博客,里面我曾提过建堆的时间复杂度是O(N),那么是为什么呢?下面进行推导

建堆的时间复杂度详解_第1张图片

 按照最坏情况,该堆是满二叉树,如上图

 又依据公式:

建堆的时间复杂度详解_第2张图片

黑色框圈住的代表的是每层有的节点的个数

第一层有2^(1-1) 个,第二层又2^(2-1)个,第h-1层有2^(h-1-1)个,第h层又2^(h-1)个

红色框圈住的代表的是每一层的字树最多需要向下调整的次数

我们假设这个二叉树有四层,第一层需要向下调整的次数是3次,第二层是两次,第三层是1次,第四层是0次,推广到这个二叉树有h层,第一层就是h-1次,第二层是h-2次....第h-1层就是1次,第h层就是0次。

黑色框中的数乘以红色框中的数,代表着,每层的节点一共需要向下调整的次数。

假设这个满二叉树有四层

以第三层为例,第三层有4个结点,一个节点最多需要向下调整1次,那么4个节点一共需要向下调整4次

 最后将每层节点需向下调整的次数相加就是最终的时间复杂度。

也就是下图。 

利用错位相减法计算

建堆的时间复杂度详解_第3张图片

 最终结果是 N-log(N+1) ,由于当N趋于很大时,log(N+1)可以忽略,

所以建堆的时间复杂度就是 O(N) ;

你可能感兴趣的:(数据结构,链表,数据结构,堆排序,算法)