web-dev-qa-db-ja.com

Max-Heapifyの最悪のケース-2n / 3を取得する方法

CLRS、第3版、155ページでは、MAX-HEAPIFYでは、

子のサブツリーのサイズはそれぞれ最大2n/3です。最悪のケースは、ツリーの最下位レベルがちょうど半分いっぱいになった場合です。

ツリーの最下位レベルがちょうど半分いっぱいになったときに最悪になる理由を理解しています。また、この質問で回答されています MAX-HEAPIFYの最悪のケース:「ツリーの最下位レベルがちょうど半分いっぱいになったときに最悪のケースが発生します」

私の質問は、2n/3を取得する方法ですか?

最下位レベルが半分いっぱいになっている場合、子ツリーのサイズが最大2n/3になるのはなぜですか?

それを計算する方法は?

ありがとう

66
Jackson Tale

各ノードに正確に0または2つの子があるツリーでは、0の子を持つノードの数は2の子を持つノードの数よりも1つ多くなります。{説明:高さhのノードの数は2 ^ hです。幾何級数の合計式は(高さ0からh-1までのノードの合計)+ 1に等しい;そして、高さ0からh-1までのすべてのノードは、ちょうど2つの子を持つノードです}

    ROOT
  L      R
 / \    / \
/   \  /   \
-----  -----
*****

Rのノード数をkとします。Lのノード数はk +(k + 1)= 2k + 1です。ノードの総数はn = 1 +(2k + 1)+ k = 3k + 2です。 (ルートとLとR)。比率は(2k + 1)/(3k + 2)であり、上で2/3によって制限されます。 kが無限大になるときの制限は2/3であるため、2/3未満の定数は機能しません。

52
swen

_Understand the maximum number of elements in a subtree happens for the left subtree of a tree that has the last level half full.Draw this on a piece of paper to realize this._

それが明らかになれば、2N/3の境界は簡単に取得できます。

ツリー内のノードの総数がNであると仮定しましょう。

ツリーのノード数= 1 +(左サブツリーのノード数)+(右サブツリーのノード数)

ツリーの最後のレベルが半分、iFである場合、右のサブツリーは高さhであり、高さ(h + 1)の場合は左のサブツリーであると仮定します。

左サブツリーのノード数= 1 + 2 + 4 + 8 .... 2 ^(h + 1)= 2 ^(h + 2)-1 .....(i)

右サブツリーのノード数= 1 + 2 + 4 + 8 .... 2 ^(h)= 2 ^(h + 1)-1 .....(ii)

したがって、以下に接続します。

ツリーのノード数= 1 +(左サブツリーのノード数)+(右サブツリーのノード数)

=> N = 1 + (2^(h+2)-1) + (2^(h+1)-1)

=> N = 1 + 3*(2^(h+1)) - 2

=> N = 3*(2^(h+1)) -1

=> 2^(h+1) = (N + 1)/3

この値を方程式(i)に代入すると、次のようになります。

Number of nodes in Left Subtree = 2^(h+2)-1 = 2*(N+1)/3 -1 =(2N-1)/3 < (2N/3)

したがって、N個のノードを持つツリーのサブツリー内のノードの最大数の上限は2N/3です。

34
Aravind

高さhの完全なバイナリツリーの場合、ノードの数はf(h) = 2^h - 1です。上記の場合、下半分がいっぱいのほぼ完全なバイナリツリーがあります。これを_root + left complete tree + right complete tree_のコレクションとして視覚化できます。元のツリーの高さがhの場合、左の高さは_h - 1_で、右は_h - 2_です。方程式は

n = 1 + f(h-1) + f(h-2)(1)

nの項で表されるf(h-1)について上記で解決したい

f(h-2) = 2^(h-2) - 1 = (2^(h-1)-1+1)/2 - 1 = (f(h-1) - 1)/2(2)

(1)で上記を使用して、

n = 1 + f(h-1) + (f(h-1) - 1)/2 = 1/2 + 3*f(h-1)/2

=> f(h-1) = 2*(n-1/2)/3

したがって、O(2n/3)

14
Ankush

-のノード数

  • レベル0、つまりルートは2 ^ 0
  • レベル1は2 ^ 1です
  • レベル2は2 ^ 2です
  • ...
  • レベルnは2 ^ nです

レベル0からレベルnまでのすべてのノードの合計、

  • S = 2 ^ 0 + 2 ^ 1 + 2 ^ 2 + ... + 2 ^ n

幾何級数の総和規則から、

  • x ^ 0 + x ^ 1 + x ^ 2 + ... + x ^(n)=(x ^(n + 1)-1)/(x-1)

X = 2を代入すると、

  • S = 2 ^(n + 1)-1.すなわち2 ^(n + 1)= S + 1

2 ^(n + 1)はレベルn + 1の合計ノードであるため、子が0のノードの数は、子が2のノードの数よりも1多いと言えます。

ここで、左のサブツリー、右のツリー、合計のノード数を計算します。

  • ルートの左のサブツリーにある葉以外のノードの数= kと仮定します。
  • 上記の推論により、左のサブツリーまたはルートのリーフノードの数= k +1。ルート= kの右のサブツリーの非リーフノードの数は、ツリーがちょうど半分いっぱいであると言われています。

  • ルートの左サブツリー内のノードの総数= k + k + 1 = 2k +

  • ツリー内のノードの総数、n =(2k + 1)+ k + 1 = 3k + 2。
  • 左側のサブツリーのノードと合計ノードの比率=(2k + 1)/(3k + 2)これは上で2/3によって制限されます。

これが、子のサブツリーのサイズがそれぞれ最大で2n/3であると言う理由です。

Swenの答えに追加します。 (2k + 1)/(3k + 2)が2/3になる傾向があるとき、kが無限になる傾向がある場合、

Lim_(k-> inf)(2k + 1)/(3k + 2)= Lim_(k-> inf)k(2 + 1/k)/ k(3 + 2/k)= Lim_(k-> inf )(2 + 1/k)/(3 + 2/k)

制限を適用すると、2/3が得られます

1
Neo M Hacker