Python heapify()时间复杂度

时间:2018-08-07 21:29:12

标签: python python-3.x python-2.7 heap heapq

def heapify(A):
    for root in xrange(len(A)//2-1, -1, -1):
        rootVal = A[root]
        child = 2*root+1
        while child < len(A):
            if child+1 < len(A) and A[child] > A[child+1]:
                child += 1
            if rootVal <= A[child]:
                break
            A[child], A[(child-1)//2] = A[(child-1)//2], A[child]
            child = child *2 + 1

这是python heapq.heapify()的类似实现。据说在文档中此函数在O(n)中运行。但是,对于n / 2个元素,它似乎执行log(n)操作。为什么是O(n)?

1 个答案:

答案 0 :(得分:3)

它需要更仔细的分析,例如您会find here。基本见解是,只有堆的根实际上具有深度log2(len(a))。向下在叶子上方一个节点处(其中一半节点生活在其中)在第一次内循环迭代中命中一片叶子。