バイナリヒープ:O(n)の構築の複雑さの証明

実際、Sift-Down(またはHeapify)を使用してバイナリヒープとその構築について説明します 。 この方法でヒープを構築することは、 画像 。 ここで、この事実の証拠を示します。



これは、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;
      
      







だから、で構成される配列を与えましょう 画像 要素、および 画像 オペレーター呼び出しの数 画像 (手順で 画像 )この配列でヒープを構築するとき。 明らかに 画像 手順の操作時間を決定します 画像 これは私たちにとって興味深いです。



補題。
呼び出されたときに配列のいくつかの要素をみましょう 画像 終わった 画像 オペレーターコール 画像 。 その後、そのインデックスは超えませんでした 画像



証明:


画像 オペレーターコール 画像 インデックス 画像 少なくとも要素が増加する 画像 回。 さあ 画像 、つまり 画像 。 その後 画像 電話があります 画像 それは不可能です 画像 要素。 画像



数量を推定しましょう 画像 。 配列要素にインデックスを持たせる 画像 。 見つけるだろう 画像 そのような 画像 。 次に、インデックス付きの要素を配列するために 画像 ヒープ上の所定の位置に落ちたので、これ以上は不要 画像 呼び出します 画像 (補題による)。 そのようなインデックスを持つ要素の数は値です 画像 どの 画像 消えます。



このように



画像

画像 項はゼロです(したがって、手順のサイクル 画像 で始めることができます 画像

合計の各項の左因子を次のように推定します



画像



ここから:



画像



それぞれの合計を評価します。



画像



画像



このように 画像

画像 上にある関数によって制限される 画像 。 手段 画像

したがって、手順の操作時間 画像 比例する値があります 画像



All Articles