对于创建一个最小堆或一个n个元素的最大堆,创建堆所需的时间为o(nlogn)。因为,每次插入都需要o(logn)时间,因此n个元素需要o(nlogn)时间
但在许多地方,堆的创建可以优化为o(n)时间,即线性时间?但还没有清楚的说明怎么做?
最佳答案
最佳方法不需要logn时间来插入节点。
优化方法首先将元素任意放在
二叉树,尊重形状属性(因为树可以是
由数组表示)。从最底层开始
向上移动,向下移动每个子树的根,如
还原堆属性之前的删除算法。更多
特别是如果所有子树从某个高度开始h
(测量
从底部)已经被“修复”,树在高处h+1
可以通过沿着
最大值儿童在构建max-heap
或最小值时
当建立min-heap
时的子对象。这个过程需要O(h)
交换
每个节点的操作数。在这种方法中,大部分的治疗需要
放在较低的位置由于堆的高度是logn
,
高度节点数为h
因此
修复所有子树是:
H=0∑对数N/2H+1=O(N*
h=0∑lognh/2h),小于
O(n*h=0∑∞h/2h)
since h / 2h converges to 2 as it is an infinite series
等于
O(n)
来源:http://en.wikipedia.org/wiki/Binary_heap#Building_a_heap