Dans CLRS, troisième édition, page 155, il est indiqué que dans MAX-HEAPIFY,
Les sous-arbres des enfants ont chacun une taille maximale 2n/3 - le pire des cas se produit lorsque le niveau inférieur de l'arbre est exactement à moitié plein.
Je comprends pourquoi c'est pire quand le niveau inférieur de l'arbre est exactement à moitié plein. Et il est également répondu dans cette question le pire des cas dans MAX-HEAPIFY: "le pire des cas se produit lorsque le niveau inférieur de l'arbre est exactement à moitié plein"
Ma question est de savoir comment obtenir 2n/3?
Pourquoi si le niveau inférieur est à moitié plein, la taille de l'arbre enfant peut atteindre 2n/3?
Comment calculer ça?
Merci
Dans un arbre où chaque nœud a exactement 0 ou 2 enfants, le nombre de nœuds avec 0 enfant est un de plus que le nombre de nœuds avec 2 enfants. {Explication: le nombre de nœuds à la hauteur h est de 2 ^ h, ce qui par la formule de sommation d'une série géométrique égale (somme des nœuds de la hauteur 0 à h-1) + 1; et tous les nœuds de la hauteur 0 à h-1 sont les nœuds avec exactement 2 enfants}
ROOT
L R
/ \ / \
/ \ / \
----- -----
*****
Soit k le nombre de nœuds dans R. Le nombre de nœuds dans L est k + (k + 1) = 2k + 1. Le nombre total de nœuds est n = 1 + (2k + 1) + k = 3k + 2 (racine plus L plus R). Le rapport est (2k + 1)/(3k + 2), qui est délimité ci-dessus par 2/3. Aucune constante inférieure à 2/3 ne fonctionne, car la limite lorsque k va à l'infini est de 2/3.
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.
Une fois que c'est clair, la limite de 2N/3 est facile à obtenir.
Supposons que le nombre total de nœuds dans l'arbre est N.
Nombre de nœuds dans l'arbre = 1 + (Nombre de nœuds dans le sous-arbre gauche) + (Nombre de nœuds dans le sous-arbre droit)
Pour notre cas où l'arbre a le dernier niveau à moitié plein, iF nous supposons que le sous-arbre droit est de hauteur h, puis le sous-arbre gauche s'il est de hauteur (h + 1):
Nombre de nœuds dans le sous-arbre gauche = 1 + 2 + 4 + 8 .... 2 ^ (h + 1) = 2 ^ (h + 2) -1 ..... (i)
Nombre de nœuds dans le sous-arbre droit = 1 + 2 + 4 + 8 .... 2 ^ (h) = 2 ^ (h + 1) -1 ..... (ii)
Ainsi, se brancher sur:
Nombre de nœuds dans l'arbre = 1 + (Nombre de nœuds dans le sous-arbre gauche) + (Nombre de nœuds dans le sous-arbre droit)
=> 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
En branchant cette valeur dans l'équation (i), nous obtenons:
Number of nodes in Left Subtree = 2^(h+2)-1 = 2*(N+1)/3 -1 =(2N-1)/3 < (2N/3)
Par conséquent, la limite supérieure du nombre maximal de nœuds dans un sous-arbre pour un arbre à N nœuds est 2N/3.
Pour un arbre binaire complet de hauteur h
, le nombre de nœuds est f(h) = 2^h - 1
. Dans le cas ci-dessus, nous avons un arbre binaire presque complet avec le fond à moitié plein. Nous pouvons visualiser cela comme une collection de root + left complete tree + right complete tree
. Si la hauteur de l'arbre d'origine est h
, alors la hauteur de gauche est h - 1
Et la droite est h - 2
. Donc l'équation devient
n = 1 + f(h-1) + f(h-2)
(1)
Nous voulons résoudre ci-dessus pour f(h-1)
exprimé en termes de n
f(h-2) = 2^(h-2) - 1 = (2^(h-1)-1+1)/2 - 1 = (f(h-1) - 1)/2
(2)
En utilisant ci-dessus dans (1), nous avons
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
D'où O (2n/3)
Nombre de nœuds à -
Sommation de tous les nœuds du niveau 0 au niveau n,
De la règle de sommation des séries géométriques, nous savons que
En substituant x = 2, on obtient
Comme 2 ^ (n + 1) est le nombre total de nœuds au niveau n + 1, nous pouvons dire que le nombre de nœuds avec 0 enfant est un de plus que le nombre de nœuds avec 2 enfants.
Permet maintenant de calculer le nombre de nœuds dans le sous-arbre gauche, l'arbre de droite et le total.
Par le raisonnement ci-dessus, nombre de nœuds foliaires dans le sous-arbre gauche ou racine = k + 1. Nombre de nœuds non-feuilles dans le sous-arbre droit de racine = k car l'arbre est dit être exactement à moitié plein.
Nombre total de nœuds dans le sous-arbre gauche de racine = k + k + 1 = 2k +
C’est la raison pour laquelle les sous-arbres des enfants ont chacun une taille maximale de 2n/3.
Pour ajouter à la réponse de swen. Comment (2k + 1)/(3k + 2) tend vers 2/3, quand k tend vers l'infini,
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)
appliquez la limite, et vous obtenez 2/3