请考虑以下用于构建输入数组A的堆的算法。
BUILD-HEAP(A) heapsize := size(A); for i := floor(heapsize/2) downto 1 do HEAPIFY(A, i); end for END
快速查看上述算法表明,运行时间是,因为每次调用Heapify成本和Build-Heap进行这样的调用。
这个上限虽然正确,但并不是渐近的。
我们可以通过观察推导出一个更严格的约束:Heapify的运行时间取决于树的高度h’(等于lg(n),其中n是节点数),并且大多数子树的高度是小的。
随着我们沿着树向上移动,身高’h’增加。构建堆的第3行从最后一个内部节点(heapsize / 2)的索引运行一个循环,高度= 1,到具有height = lg(n)的root(1)的索引。因此,Heapify为每个节点花费不同的时间。
为了找到构建堆的时间复杂度,我们必须知道具有高度h的节点数。
为此,我们使用的事实是,大小为n的堆最多有个具有高度为h的节点。
我们得出的时间复杂度,我们表达构建堆的总时间复杂度:
(1)
步骤2使用Big-O符号的属性来忽略上限函数和常数2()。同样在第三步中,由于我们使用Big-O符号,所以求和的上限可以增加到无穷大。
Sum of infinite G.P.(x <1)
(2)
在区分双方并乘以x时,我们得到
(3)
将(3)中得到的结果返回到我们的推导(1)中,我们得到
(4)
因此证明建立二叉堆的时间复杂度是。