AVL Trees et le monde réel

14

à l'école, on nous apprend comment équilibrer un arbre AVL lors d'une insertion ou d'une suppression.

Comment ce type de connaissances sera-t-il réellement utile dans le monde réel? Quelqu'un peut-il donner un exemple sur le moment où ce type de connaissances serait réellement utile?

D'après ce que j'ai vu, sur le lieu de travail, de tels détails n'apparaissent presque jamais ...

Je peux voir à quel point des connaissances détaillées sur les algorithmes et certaines structures de données peuvent être importantes, mais pas sur des détails tels que les rotations d'arbres AVL (et des concepts détaillés similaires).

Merci!

rrazd
la source
7
C'est utile dans les interviews, si cela compte comme le monde réel.
Kevin
C'est le même argument que certaines personnes font à propos de l'apprentissage de la trigonométrie à l'école "Sheesh! Quand vais-je jamais l'utiliser dans la vraie vie?", Et la réponse est "il vous a pensé comment analyser et résoudre une classe entière de problèmes" . Cela et un jour vous voulez abattre un arbre et votre partenaire vous demande "Êtes-vous sûr que ça ne va pas frapper la maison?" Trig à la rescousse!
Binary Worrier

Réponses:

13

L'étude des arbres AVL peut être utile pour les raisons suivantes:

  • C'est une excellente pratique pour raisonner sur les données abstraites. Vous n'avez pas à penser à un arbre particulier, vous devez considérer toutes les possibilités. La pratique de ce type de raisonnement peut également aider dans des cas plus simples.

  • C'est une excellente pratique pour comprendre les prédicats et les contrats. S'assurer qu'un arbre est équilibré et que les outils que vous utilisez pour prouver l'équilibre de chaque opération peuvent être appliqués, par exemple, aux problèmes de sécurité et au code parallèle.

  • Il vous permet d'écrire vos propres variantes ou même de créer des types de structures de données entièrement nouveaux.

  • Vous devrez peut-être simplement implémenter une arborescence AVL pour une nouvelle bibliothèque ou plate-forme.

Vous pouvez débattre des mérites particuliers de l'apprentissage de chaque type d'algorithme de tri ou de chaque type d'arbre équilibré. Il ne compte pas vraiment qui ceux que vous finissez par apprendre, mais vous devez être sûr d'obtenir une couverture complète des sujets les plus importants.

Si vous voulez voir à quel point les algorithmes de connaissance sont importants dans le monde réel, lisez " Comment tuer une grande idée! ", Un article dans Inc sur la chute de Friendster, et comment la moindre application de principes fondamentaux pour améliorer l'efficacité aurait pu les aider.

Macneil
la source
Article intéressant, mais je ne vois pas comment les arbres AVL auraient aidé Friendster.
Eratosthène
J'aurais aimé voir un exemple, comme B + -Arbres sont utilisés pour l'indexation de la base de données.
Luca Fülbier
5

En plus des points Macneils ...

Les arbres rouge-noir sont peut-être plus directement utiles car il existe des opérations efficaces utiles qui ne sont pas largement prises en charge dans les implémentations de bibliothèques standard telles que le C ++ std::map(au moins AFAIK). Les arbres rouge-noir peuvent prendre en charge le «fractionnement» (couper un arbre en deux, un contenant des clés de moins qu'une clé spécifiée et un contenant des clés de plus) et «joindre» (l'inverse, combinant un arbre de grandes clés avec un arbre de petites ) peuvent toutes deux être effectuées en temps O (log n), mais si elles sont prises en charge dans les bibliothèques de conteneurs standard, cela semble être une chose bien cachée.

Cependant, "augmenter" les structures de données est courant. Un exemple simple est l'ajout d'informations sur la taille de la sous-arborescence aux nœuds dans presque toutes les structures de données arborescentes pour prendre en charge l'indexation O (log n). Des exemples plus sophistiqués incluent les arbres d'intervalle.

Une fois que vous avez l'idée d'augmenter les structures de données, il existe de nombreuses variantes qui peuvent être utiles pour des applications particulières - et très peu sont disponibles pré-emballés sous forme de bibliothèque. Les structures de données de bibliothèque standard existantes (par exemple, par exemple std::map) ne peuvent pas être augmentées à moins de copier le code source et de le modifier directement - vous ne pouvez pas les augmenter en utilisant les paramètres du modèle.

Bien sûr, pour développer une structure de données augmentée, vous devez comprendre la structure de données non augmentée sous-jacente.

Les arbres AVL peuvent être plus rapides que les arbres rouge-noir si vous effectuez beaucoup plus de recherches que d'insertions / suppressions (et à condition que vous n'ayez pas besoin de ces opérations de fractionnement / jointure), donc selon l'application, ils peuvent être une très bonne base pour augmentant.

Steve314
la source
1
+1 pour augmenter la structure des données, bien que ce soit une chose assez rare à faire. La plupart des programmeurs n'ont pas à rechercher les performances (sinon nous utiliserions tous C ++ / C / Fortran / Assembly).
Matthieu M.
@Matthieu - Je pense que c'est courant, mais seulement dans certains types d'environnements de développement. Ce n'est pas une contradiction, honnêtement, parce que ... euh, eh bien ...
Steve314
Je suis complètement d'accord! : D
Matthieu M.
5

Non

Ce n'est vraiment pas utile dans le monde réel ...

Sauf pour vous faire réfléchir .

Le monde réel a des problèmes beaucoup plus difficiles , dont beaucoup n'ont pas déjà de solutions bien connues.

Steven A. Lowe
la source