【问题标题】:Creating a Min heap or a Max heap创建最小堆或最大堆
【发布时间】:2012-05-26 06:52:39
【问题描述】:
对于创建一个包含 n 个元素的 Min heap 或 Max Heap,创建一个堆所花费的时间将是 O(nlogn)。因为,每次插入都需要 O(logn) 时间,因此 n 个元素需要 O(nlogn) 时间
但是在很多地方都写到堆的创建可以优化到 O(n) 时间,即线性时间?但是没有清楚地解释如何?
【问题讨论】:
标签:
algorithm
time
heap
complexity-theory
time-complexity
【解决方案1】:
最佳方法不需要登录时间来插入节点。
最佳方法是从任意放置元素开始
二叉树,尊重形状属性(因为树可能是
由数组表示)。然后从最低层开始
向上移动,将每个子树的根向下移动,如
删除算法,直到堆属性恢复。更多的
特别是如果所有子树都从某个高度 h 开始(测量
从底部开始)已经“堆积”了,高处的树木
h+1 可以通过将它们的根向下发送到
构建max-heap 时的最大值子级,或最小值
孩子们在构建min-heap 时。这个过程需要O(h)交换
每个节点的操作。在这种方法中,大多数堆化需要
放置在较低的级别。由于堆的高度是 logn ,
高度的节点数为h。因此,成本
堆积所有子树是:
h=0∑logn 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