Max-Heapifyの最悪の場合-2n / 3を取得するにはどうすればよいですか?


81

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

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

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

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

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

それを計算する方法は?

ありがとう


5
簡単な計算はこのブログで提供されています:bit.ly/138f43F
akaHuman 2013年

回答:


65

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

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

kをRのノード数とします。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以上の定数は機能します。


2
ええ、
Jackson Tale

7
ワオ。それは深かった。どうやって自分でそれを理解したのですか?
プログラミングNoob 2012年

38

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です。


まだわかりません。いっぱいになっても起こらないのではないでしょうか、なぜ半分いっぱいにしなければならないのですか。誰かが説明します-私は混乱しています。
Sundar Rajan 2018年

1
@SundarRajan checkmath.stackexchange.com/questions/181022/…特に一部This is the most the heap can get imbalanced; adding another node will either begin to rebalance the heap (by filling out the other, right, half of the last level) or break the heap's shape property of being a complete binary tree
momo

いい説明。
イーグル

14

高さの完全な二分木の場合、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)

上記を解いて、次のようにf(h-1)表現したいn

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)


9
f(h)= 2 ^(h + 1)-1ではないですか?
a_fan 2013

素晴らしい答え。@afnrf
Ajay

2

スウェンの答えに追加します。kが無限大になる傾向がある場合、(2k + 1)/(3k + 2)が2/3になる傾向がある方法

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が得られます


2

-のノード数

  • レベル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であると言う理由です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.