これは、Pascalの配列上にヒープを構築する手順の例です。
procedure siftdown(v:longint); var min,l,r:longint; begin l:=v*2; r:=v*2+1; min:=v; if (l <= s) and (a[l] < a[min]) then min:=l; if (r <= s) and (a[r] < a[min]) then min:=r; if min <> v then begin swap(a[min], a[v]); sift_down(min); end; end; procedure build; var i:longint; begin for i:=n downto 1 do siftdown(i); end;
だから、で構成される配列を与えましょう 要素、および オペレーター呼び出しの数 (手順で )この配列でヒープを構築するとき。 明らかに 手順の操作時間を決定します これは私たちにとって興味深いです。
補題。
呼び出されたときに配列のいくつかの要素をみましょう 終わった オペレーターコール 。 その後、そのインデックスは超えませんでした 。証明:
で オペレーターコール インデックス 少なくとも要素が増加する 回。 さあ 、つまり 。 その後 電話があります それは不可能です 要素。
数量を推定しましょう 。 配列要素にインデックスを持たせる 。 見つけるだろう そのような 。 次に、インデックス付きの要素を配列するために ヒープ上の所定の位置に落ちたので、これ以上は不要 呼び出します (補題による)。 そのようなインデックスを持つ要素の数は値です どの 消えます。
このように
で 項はゼロです(したがって、手順のサイクル で始めることができます )
合計の各項の左因子を次のように推定します
ここから:
それぞれの合計を評価します。
このように 。
上にある関数によって制限される 。 手段 。
したがって、手順の操作時間 比例する値があります 。