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