构建堆的时间复杂度

请考虑以下用于构建输入数组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) 《构建堆的时间复杂度》

因此证明建立二叉堆的时间复杂度是《构建堆的时间复杂度》

    原文作者:wongyi
    原文地址: https://www.cnblogs.com/wongyi/p/7685061.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞