AVL et les arbres noirs rouges sont tous deux auto-équilibrés, sauf les couleurs rouge et noire dans les nœuds. Quelle est la raison principale du choix des arbres noirs rouges au lieu des arbres AVL? Quelles sont les applications des arbres noirs rouges?
109
Réponses:
Les arbres rouge-noir et les arbres AVL sont les arbres de recherche binaires équilibrés les plus couramment utilisés et ils prennent en charge l'insertion, la suppression et la recherche garanties
O(logN) time
. Cependant, il existe les points de comparaison suivants entre les deux:O(N)
plus de place. Cependant, si on sait que les clés qui seront insérées dans l'arbre seront toujours supérieures à zéro, on peut utiliser le bit de signe des clés pour stocker les informations de couleur d'un arbre rouge-noir. Ainsi, dans de tels cas, l'arbre rouge-noir ne prend pas d'espace supplémentaire.Les arbres rouge-noir sont plus polyvalents. Ils fonctionnent relativement bien pour l'ajout, la suppression et la recherche, mais les arbres AVL ont des recherches plus rapides au prix d'une ajout / suppression plus lente. L'arbre rouge-noir est utilisé dans ce qui suit:
java.util.TreeMap
,java.util.TreeSet
la source
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
ce n'est pas vrai.std:: map
et les amis utilisent une structure particulière. C'est laissé à l'implémentation, bien que libstdc ++ et Dinkumware utilisent au moins des arbres rouge-noir, et il semble que vous ayez raison dans la pratique.Essayez de lire cet article
Il offre de bonnes informations sur les différences, les similitudes, les performances, etc.
Voici une citation de l'article:
D'après ma propre compréhension, les arbres AVL et RB ne sont pas très éloignés en termes de performances. Un arbre RB est simplement une variante d'un arbre B et l'équilibrage est implémenté différemment d'un arbre AVL.
la source
Notre compréhension des différences de performances s'est améliorée au fil des ans et maintenant, la principale raison d'utiliser des arbres rouge-noir sur AVL serait de ne pas avoir accès à une bonne implémentation AVL car ils sont légèrement moins courants, peut-être parce qu'ils ne sont pas couverts par CLRS.
Les deux arbres sont maintenant considérés comme des formes d' arbres à rang équilibré, mais les arbres rouge-noir sont systématiquement plus lents d' environ 20% dans les tests du monde réel . Ou même 30 à 40% plus lent lorsque des données séquentielles sont insérées .
Ainsi, les gens qui ont étudié les arbres rouge-noir mais pas les arbres AVL ont tendance à choisir des arbres rouge-noir. Les principales utilisations des arbres rouge-noir sont détaillées sur l'entrée Wikipedia pour eux .
la source
D'autres réponses ici résument bien les avantages et les inconvénients des arbres RB et AVL, mais j'ai trouvé cette différence particulièrement intéressante:
Source: Mehlhorn & Sanders (2008) (section 7.4)
Ainsi, alors que les arbres RB et AVL garantissent le moment le plus défavorable O (log (N)) pour la recherche, l'insertion et la suppression, la restauration de la propriété AVL / RB après l' insertion ou la suppression d'un nœud peut être effectuée en temps amorti O (1) pendant arbres rouge-noir.
la source
Les programmeurs n'aiment généralement pas allouer dynamiquement de la mémoire. Le problème avec l'arborescence avl est que pour "n" éléments, vous avez besoin d'au moins log2 (log2 (n)) ... (height-> log2 (n)) bits pour stocker la hauteur de l'arbre! Ainsi, lorsque vous manipulez d'énormes données, vous ne pouvez pas être sûr du nombre de bits à allouer pour stocker la hauteur à chaque nœud.
Par exemple, si vous utilisez 4 octets int (32 bits) pour stocker la hauteur. La hauteur maximale peut être: 2 ^ 32 et donc le nombre maximum d'éléments que vous pouvez stocker dans l'arbre est de 2 ^ (2 ^ 32) - (semble être très grand mais à l'ère des données, rien n'est trop grand je suppose). Et par conséquent, si vous dépassez cette limite, vous devez allouer dynamiquement plus d'espace pour stocker la hauteur.
C'est une réponse suggérée par un professeur de mon université qui m'a paru raisonnable! J'espère avoir du sens.
Modifications: les arbres AVL sont plus équilibrés que les arbres noirs rouges, mais ils peuvent entraîner plus de rotations lors de l'insertion et de la suppression. Donc, si votre application implique de nombreuses insertions et suppressions fréquentes, les arbres Red Black devraient être préférés. Et si les insertions et suppressions sont moins fréquentes et que la recherche est une opération plus fréquente, alors l'arborescence AVL doit être préférée à l'arbre rouge noir. --Source GEEKSFORGEEKS.ORG
la source
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
Je n'ai besoin de la hauteur d'aucun nœud dans un arbre AVL pour l'implémenter. Vous avez besoin d' un peu d'informations supplémentaires pour chaque nœud ( JE SUIS LE PLUS GRAND (le frère avec le sous-arbre le plus élevé))); il est plus pratique et conventionnel d'avoir deux bits supplémentaires (l'enfant est plus haut pour la gauche et la droite), comme présenté par AV & L.Le rééquilibrage de l'arborescence AVL doit respecter la propriété ci-dessous. (Référence Wiki - Arbre AVL )
Cela implique donc que la hauteur totale de l'arbre AVL ne peut pas devenir folle, c'est-à-dire que les recherches seront meilleures avec les arbres AVL. Et comme des opérations supplémentaires (rotations) doivent être effectuées pour ne pas laisser la hauteur devenir folle, les opérations de modification d'arbre peuvent être un peu coûteuses.
la source