Est-il acceptable de ne pas comprendre pleinement les arbres RB? [fermé]


15

Alors je viens d'apprendre les arbres rouges noirs à Cormen et wow! En règle générale, j'aime comprendre tous les algorithmes et structures de données au point que je peux les reconstruire à partir de zéro sans avoir à tricher en regardant le pseudo-code. J'aime vraiment les algorithmes, donc j'aime apprendre comment ils fonctionnent et je vais généralement ligne par ligne et j'essaie certains cas en regardant le code et en vérifiant si ce qui se passe est ce que j'ai compris que cela devrait se produire.

Le simple fait de comprendre ce qui se passait m'a pris BEAUCOUP de temps pour les arbres RB. Même avec les explications du livre, j'ai toujours eu du mal à saisir le code. Sans oublier que je ne comprenais pas comment / pourquoi les rotations fonctionnent. Je ne le trouve pas du tout intuitif. Je veux dire, les trois (six en fait) cas différents pour l'insertion puis les 4 cas pour la suppression? Est-il possible de comprendre cette chose? Il m'est impossible de reconstruire ce code sans tricher. Jusqu'à l'arbre binaire, je pouvais implémenter les choses de ma tête, avec quelques ajustements, cela fonctionnerait toujours, mais les arbres RB, je ne vais même pas essayer. Je veux dire, même le professeur est parfois confus, donc je suppose que ce n'est vraiment pas si facile, mais en même temps, ne devrions-nous pas avoir à comprendre tout ce qui se passe ou du moins pourquoi? Le livre n'a pas t vraiment expliquer comment quelqu'un a eu l'idée des rotations. Comment quelqu'un a-t-il remarqué qu'avec 2 rotations, vous pouviez résoudre n'importe quel problème d'insertion? C'est incroyable!

Ma question est, dois-je vraiment comprendre à 100% les arbres RB? Je me sens un peu mal de sauter des trucs sans bien le comprendre. Merci d'avance les gars! (PS: il n'y a pas de balise pour RB-tree, en fait même pas pour tree, juste binary-tree, donc je ne mets que des algorithmes)


18
"Jeune homme, en mathématiques, tu ne comprends pas les choses. Tu t'y habitues." - John von Neumann

2
@Clash Dans quel contexte? Je ne pense pas avoir jamais eu besoin de savoir comment les arbres RB fonctionnent dans un environnement professionnel, mais cela peut varier en fonction de ce que vous voulez faire. Je dirais que vous pouvez les sauter jusqu'à ce que vous en ayez besoin.
Adam Lear

4
@Clash Cela me dérange énormément que vous disiez que c'est "tricher" de mettre en œuvre quoi que ce soit avec des conseils provenant d'une source externe. Le pseudocode existe pour une raison - ils éliminent la nécessité de le faire de la mémoire. Je suis entièrement d'accord avec Winston: comprendre et savoir de mémoire sont deux choses différentes qui s'excluent mutuellement. Mémoriser! = Comprendre et comprendre! = Mémoriser.
doppelgreener

3
Il est normal de ne pas vraiment se soucier des arbres RB - jusqu'à ce que j'en ai besoin?
Steven A. Lowe

1
Peut-être comprendre QUAND vous devez utiliser les arbres RB, de préférence à tous les autres types d'implémentation d'arbres. Sachez quels problèmes ils résolvent et toutes les raisons du choix des arbres RB. Mais si jamais vous devez en implémenter un (en dehors d'un examen, bien sûr), vous pourrez le rechercher; alors pourquoi s'embêter à savoir comment le faire de mémoire?
Dawood dit de réintégrer Monica

Réponses:


13

Vous semblez assimiler l'idée de «comprendre» à «être capable d'écrire le code sans regarder le livre». Ce sont deux choses différentes. Si vous pouvez voir comment la rotation des nœuds d'arbre réorganise l'arbre afin de maintenir l'équilibre, alors vous le comprenez. Être capable de rappeler immédiatement tous les cas pour lesquels des rotations s'appliquent n'est pas la question.

Moi-même, je pourrais probablement comprendre les rotations si j'avais un stylo / papier / plusieurs heures pour jouer avec. Mais je ne pourrais certainement pas l'écrire sans une pensée. Si je devais réellement écrire un tel algorithme, je le vérifierais pour m'assurer que j'obtenais tous les détails correctement. Bien sûr, dans presque toutes les situations, j'utiliserais du code déjà écrit.

Lorsque tout cela est utilisé, c'est lorsque vous rencontrez une situation qui ne correspond pas tout à fait aux algorithmes. Vous n'aurez jamais besoin d'écrire votre propre implémentation d'arborescence. Mais vous pourriez vous retrouver, disons, devant aplanir une héritière de listes doublement liées. Dans ce cas, avoir compris l'idée de base de la rotation peut être très utile.


2
«Vous semblez assimiler l'idée de« comprendre »à« être capable d'écrire le code sans regarder le livre ». Ce sont deux choses différentes.' Euh ... non. Si vous écrivez ceci, cela signifie probablement que vous n'avez pas étudié les mathématiques bien au-delà d'un an ou deux d'université, si ce n'est que cela. À un moment donné, «comprendre» les mathématiques (qui, avec l'aimable autorisation de Turing, équivaut à l'informatique), c'est seulement être capable de démontrer ce que vous avez «compris». Il n'y a pas de solution de contournement ou ifs ou maybes ou foo ou bar ou baz. À ce niveau, si vous ne pouvez pas prouver votre affirmation mathématique, vous êtes grillé. (Sauf si vous vous appelez Fermat.)
Denis de Bernardy

14
@Dennis, j'ai un MS en CS avec un nombre de cours de mathématiques supérieur à la moyenne pour la majeure. Je crains que vous n'ayez pas compris mon point. Être capable de prouver ou de démontrer ce que vous comprenez est très important. Être capable de mémoriser les détails d'une preuve ou d'une méthode ne l'est pas. Vous DEVRIEZ être en mesure d'écrire le code. Mais je ne vois aucune utilité à une exigence pour pouvoir écrire le code de MEMORY.
Winston Ewert

2
Faites également attention où vous le recherchez - IIRC, certains manuels ont des erreurs importantes dans leurs algorithmes d'arbre rouge-noir.
Steve314

2
@ Steve314, vous n'avez même pas besoin de comprendre RB pour être un auteur de manuels scolaires! ;)
Winston Ewert

Merci Winston, cela me soulage! Il n'y a que quelques choses que je n'ai pas comprises avec le code que je pourrais publier dans un avenir proche. Mais je suis tellement content qu'il soit correct de ne pas comprendre (par comprendre, j'entends écrire le code sans tricher) pourquoi / comment quelqu'un a remarqué les 3/6 cas pour l'insertion et 4/8 cas pour la suppression.
Bernardo Pires

4

Si vous êtes un peu familier avec la programmation fonctionnelle, vous pourriez trouver cette approche meilleure (Okasaki 1999):

http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf

Sinon, prenez au moins le cœur de la phrase d'ouverture:

Tout le monde apprend sur les arbres de recherche binaires équilibrés dans leurs cours d'initiation à l'informatique, mais même les fervents tremblent à l'idée d' implémenter une telle bête.


Hahah ryan! Cela me soulage! Merci beaucoup! Aujourd'hui, j'ai également remarqué qu'il y a très peu de questions sur SO à propos de RB-Trees. Je suppose donc qu'ils sont vraiment délicats.
Bernardo Pires

2
Je pense que c'est juste que, mis à part les étudiants du CS CS, c'est le genre de chose qui est implémentée environ une fois par langage de programmation. (Ou moins. Je pense que le code RB le plus populaire pour Scheme a été porté à partir du code RB pour OCaml.)
Ryan Culpepper

Le lien est rompu: miroir 1 , miroir 2 . Citation complète au cas où les deux miroirs ne seraient plus disponibles à un moment donné dans le futur: Chris Okasaki, "Red-Black Trees in a Functional Setting", Journal of Functional Programming, 9 (4), pp471-477, juillet 1999.
Snowball

3

Vous n'avez pas besoin de comprendre les rotations en détail. Vous devez comprendre la relation entre les arbres et les RB 2-3-4 arbres (voir Sedgewick). Toutes ces rotations folles ont beaucoup plus de sens quand on les considère comme des arbres 2-3-4. Si votre professeur n'a pas enseigné les arbres RB comme détail d'implémentation pour les arbres 2-3-4, vous devriez probablement lire quelque chose sur les arbres 2-3-4. (Le traitement de Sedgewick est assez bon; Wikipedia ne l'a pas.)

Plus généralement, comprendre les détails d'implémentation de la raison pour laquelle un algorithme fonctionne n'est que parfois utile. Comprendre la logique du fonctionnement de l'algorithme est presque toujours utile. Être capable de créer l'algorithme vous-même n'est généralement pas nécessaire, bien que plus vous comprenez d'algorithmes, meilleures sont vos chances.


1

Si vous avez besoin de "RB Trees By Heart" pour votre examen la semaine prochaine, vous devrez mordre la balle et les apprendre. Dans ce cas, vous devez reconsidérer vos méthodes d'apprentissage. Peut-être qu'essayer d'expliquer RB Trees à un camarade de classe vous aidera plus qu'une autre nuit d'écriture de code solitaire.

Si RB Trees est une base pour votre prochain cours après les vacances, sautez-les maintenant (sans rancune) et concentrez-vous sur le cours de ce semestre. Mais gardez les yeux ouverts pour les sujets qui pourraient vous préparer à une deuxième tentative de RB Trees.

Si vous sentez honnêtement que vous n'en aurez jamais vraiment besoin (cf. commentaire d'Anna Lear), dites-leur au revoir sans regret - personne ne sait plus qu'une goutte dans la mer de la connaissance (c'est dommage que les enseignants pensent souvent que leur goutte est la plus importante) important).


1

La clé du succès de la programmation est de ne jamais abandonner :

Aujourd'hui ses arbres RB demain ce sera autre chose. La plus grande leçon n'est pas d'abandonner .

Pour moi, c'est l'un des éléments essentiels de la programmation, ne pas abandonner ...

Je suggérerais que vous continuiez d'essayer , et quand vous échouez, recommencez .

"Jusqu'à ce que vous obteniez, jusqu'à ce qu'il clique, jusqu'à ce qu'il s'exécute."

Parce qu'une fois que vous avez surmonté les montagnes, le ciel devient clair. Votre esprit change de compréhension, vous êtes temporairement élevé (jusqu'à la prochaine montagne) . Cette élévation temporelle vaut plus que tout l'argent du monde.


Merci, c'était exactement ma peur! Si j'abandonne, qu'est-ce qui m'empêche d'abandonner la prochaine chose? C'est pourquoi j'ai perdu presque toute une journée juste pour comprendre l'insertion et la suppression.
Bernardo Pires

Ce n'est jamais un gaspillage, croyez-moi quand il "clique" sur l'élévation fait plus que compenser toute la sueur et les larmes.
Darknight

0

La meilleure façon de le comprendre est de l' essayer :

  • Il y a 3 ou 6 rotations. Prenez un morceau de papier et écrivez-les un par un.
  • Une fois que vous l'avez obtenu, allez implémenter un arbre rouge noir. Ce n'est pas grave si vous devez rechercher quelques éléments.

C'est comme ça qu'on a fait au collège. Et pour l'examen, nous avons pu expliquer comment une partie de celui-ci fonctionnait.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.