Équilibrer un arbre binaire (AVL)

Ok, c'est un autre dans le domaine de la théorie pour les gars CS autour.

dans les années 90, j'ai assez bien réussi à mettre en oeuvre les BST. La seule chose que je n'ai jamais pu obtenir ma tête autour était la complexité de l'algorithme pour équilibrer un arbre binaire (AVL).

Pouvez-vous les gars m'aider sur ce point?

14
demandé sur Gustavo Carreno 2008-09-25 18:18:19

7 réponses

un arbre de bouc émissaire a peut-être l'algorithme le plus simple de détermination de l'équilibre à comprendre. Si une insertion provoque une trop grande profondeur du nouveau noeud, celui-ci trouve un noeud autour duquel se rééquilibrer, en regardant la balance de poids plutôt que la balance de hauteur. La règle pour savoir si rééquilibrer sur supprimer est aussi simple. Il ne stocke aucune information d'arcane dans les noeuds. C'est plus compliqué de prouver que c'est correct, mais on n'a pas besoin de ça pour comprendre l'algorithme...

Cependant, contrairement à une AVL il n'est pas à la hauteur équilibrée à tous les temps. Comme rouge-noir son déséquilibre est limité, mais contrairement rouge-noir il est accordable avec un paramètre, donc pour la plupart des fins pratiques il semble aussi équilibré que vous avez besoin qu'il soit. Je soupçonne que si vous l'accordez trop étroitement, cependant, il finit comme mauvais ou pire que AVL pour le pire des cas insertions.

réponse à la question Modifier

je fournirai mon chemin personnel pour comprendre les arbres AVL.

vous devez d'Abord comprendre ce qu'est une rotation d'arbre, alors ignorez tout ce que vous avez déjà entendu les algorithmes AVL et comprenez cela. Obtenez directement dans votre tête qui est une rotation droite et qui est une rotation gauche, et ce que chacun fait à l'arbre, ou bien les descriptions des méthodes précises ne fera que vous confondre.

ensuite, comprendre que l'astuce pour équilibrer les arbres AVL est que chaque noeud enregistre en elle la différence entre la hauteur de ses sous-arbres gauche et droite. La définition de 'height balanced' est que ceci est entre -1 et 1 inclus pour chaque noeud de l'arbre.

ensuite, comprenez que si vous avez ajouté ou enlevé un noeud, vous avez peut-être déséquilibré l'arbre. Mais vous ne pouvez avoir modifié l'équilibre des nœuds qui sont les ancêtres du nœud que vous avez ajouté ou supprimé. Donc, ce que vous allez faire est de travailler votre chemin de retour vers l'arbre, en utilisant des rotations pour équilibrer tous les noeuds déséquilibrés que vous trouvez, et en mettant à jour leur score d'équilibre, jusqu'à ce que l'arbre est équilibré encore.

la dernière partie de la compréhension c'est de chercher dans une référence décente les rotations spécifiques utilisées pour rééquilibrer chaque noeud que vous trouvez: c'est la "technique" de celui-ci par opposition au concept haut. Vous n'avez qu'à vous souvenir des détails lors de la modification du code de l'arbre AVL ou peut-être lors des examens de structure des données. Cela fait des années que je n'ai pas eu de code AVL aussi ouvert dans le débogueur - les implémentations ont tendance à aller jusqu'à un point où elles fonctionnent et restent ensuite opérationnelles. Donc je n'ai vraiment pas rappeler. Vous pouvez en quelque sorte travailler sur une table en utilisant quelques jetons de poker, mais il est difficile d'être sûr que vous avez vraiment tous les cas (il n'y a pas beaucoup). Le meilleur de le regarder.

puis il y a le travail de traduire tout cela en code.

Je ne pense pas que regarder les listes de codes aide beaucoup avec n'importe quelle étape sauf la dernière, alors ignorez-les. Même dans le meilleur des cas, où le code est clairement écrit, il ressemblera à une description classique du processus, mais sans les diagrammes. Dans un cas plus typique, c'est un gâchis de manipulation de structures. Donc, il suffit de coller à ces livres.

15
répondu Steve Jessop 2008-09-26 00:30:41

je ne pense pas que c'est bon pour le post des codes pour le nœud des algorithmes d'équilibrage ici depuis qu'ils obtiennent assez grand. Cependant, L'article de Wikipedia sur arbres rouge-noir contient une implémentation C complète de l'algorithme et de l'article sur arbres AVL a aussi plusieurs liens vers des implémentations de haute qualité.

ces deux implémentations sont suffisantes pour la plupart des scénarios généralistes.

16
répondu Konrad Rudolph 2008-09-25 14:26:34

j'ai travaillé avec des arbres AVL dernièrement.

la meilleure aide que j'ai pu trouver sur la façon de les équilibrer était en cherchant google.

j'ai juste codé autour de ce pseudo code (si vous comprenez comment faire des rotations, c'est assez facile à implémenter).

IF tree is right heavy
{
  IF tree's right subtree is left heavy
  {
     Perform Double Left rotation 
  }
  ELSE
  {
     Perform Single Left rotation
  }
}
ELSE IF tree is left heavy
{
  IF tree's left subtree is right heavy
  {
     Perform Double Right rotation
  }
  ELSE
  {
     Perform Single Right rotation
  }
}
4
répondu mscccc 2008-11-06 02:09:41

je suis d'accord, un programme complet ne serait pas approprié.

alors que les arbres AVL et RB classiques utilisent une approche déterministe, je suggère de jeter un coup d'oeil à " arbres de recherche binaires randomisés " qui sont moins coûteux à maintenir équilibré et garantissent un bon équilibre indépendamment de la distribution statistique des clés.

1
répondu Remo.D 2008-09-25 14:45:38

l'arbre AVL est inefficace parce que vous devez faire potentiellement de nombreuses rotations par insertion/suppression.

l'arbre rouge-noir est probablement une meilleure alternative parce que les insertions / suppressions sont beaucoup plus efficaces. Cette structure garantit que le chemin le plus long à une feuille n'est pas plus de deux fois le chemin le plus court. Ainsi, bien que moins équilibré qu'un arbre AVL, les cas les plus mal équilibrés sont évités.

si votre arbre sera lu plusieurs fois, et ne sera pas modifié après créé, il peut valoir le coup de tête supplémentaire pour un arbre AVL complètement équilibré. En outre, l'Arbre Rouge-Noir nécessite un peu de stockage supplémentaire pour chaque noeud, qui donne la "couleur"du noeud.

0
répondu user20493 2008-09-26 16:10:35

pour équilibrer un arbre AVL j'ai juste écrit un tas de fonctions que j'ai pensé partager avec tout le monde ici. Je suppose que cette implémentation est parfaite. Les demandes/questions / critiques sont bien sûr les bienvenues:

http://uploading.com/files/5883f1c7/AVL_Balance.cpp/

étant un novice à Stackoverflow, j'ai essayé de poster mon code ici, mais j'étais coincé avec de mauvais problèmes de formatage. Donc, le fichier téléchargé sur le lien ci-dessus.

Cheers.

0
répondu Rocky 2010-05-17 04:09:28

il y a une mise en œuvre complète d'un auto-équilibrage arbre avl @ http://code.google.com/p/self-balancing-avl-tree/ . il met également en œuvre des opérations de concaténation et de fractionnement du temps logarithmique ainsi que des collectes map/multimap

0
répondu cos 2012-07-24 23:57:18