web-dev-qa-db-ja.com

Python heapify()時間計算量

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要素の場合、ログを記録します。 (n)操作なぜO(n)なのですか?

8
typing...

ここで見つける のように、より注意深い分析が必要です。基本的な洞察は、ヒープのルートだけが実際に深さlog2(len(a))を持っているということです。リーフの1つ上のノード(ノードの半分が存在するノード)で、最初の内部ループの反復でリーフがヒットします。

6
Tim Peters