Así que acabo de aprender árboles rojos negros en Cormen y ¡guau! Por lo general, me gusta entender todos los algoritmos y las estructuras de datos hasta el punto en que puedo reconstruirlos desde cero sin tener que hacer trampa mirando el pseudocódigo. Realmente me gustan los algoritmos, así que disfruto aprendiendo cómo funcionan y generalmente voy línea por línea e intento algunos casos mirando el código y verificando si lo que está sucediendo es lo que entendí que debería suceder.
Solo entender lo que está pasando me llevó MUCHO tiempo para los árboles RB. Incluso con las explicaciones del libro, todavía me resultaba difícil comprender el código. Sin mencionar que no podía entender cómo / por qué funcionan las rotaciones. No lo encuentro intuitivo en absoluto. Quiero decir, ¿los tres (seis en realidad) diferentes casos de inserción y luego los 4 casos de eliminación? ¿Es posible entender esto? Es imposible para mí reconstruir este código sin hacer trampa. Hasta el árbol binario pude implementar las cosas de mi cabeza, con algunos ajustes siempre funcionaría, pero los árboles RB ni siquiera voy a intentarlo. Quiero decir, incluso el profesor se confundía a veces, así que supongo que realmente no es tan fácil, pero al mismo tiempo, ¿no deberíamos tener que entender todo lo que está sucediendo o al menos por qué? El libro no Realmente explica cómo a alguien se le ocurrió la idea de las rotaciones. ¿Cómo notó alguien que con 2 rotaciones podría resolver cualquier problema de inserción? ¡Eso es increíble!
Mi pregunta es, ¿realmente tengo que entender al 100% los árboles RB? Me siento un poco mal saltando cosas sin entenderlo completamente. Gracias de antemano chicos! (PD: no hay una etiqueta para RB-tree, en realidad ni siquiera para el árbol, solo binary-tree, por lo que solo pongo algoritmos)
fuente
Respuestas:
Parece equiparar la idea de "comprender" con "poder escribir el código sin mirar el libro". Estas son dos cosas diferentes. Si puede ver cómo rotar los nodos del árbol reorganiza el árbol para mantener el equilibrio, entonces lo comprende. Poder recordar de inmediato todos los casos para los que se aplican rotaciones no es el punto.
Yo mismo, probablemente podría resolver las rotaciones si tuviera bolígrafo / papel / varias horas para jugar con él. Pero ciertamente no podía escribirlo sin pensarlo. Si realmente tuviera que escribir un algoritmo así, lo buscaría para asegurarme de estar recibiendo todos los detalles correctos. Por supuesto, en casi cualquier situación usaría código ya escrito.
Donde todo esto se usa es cuando te encuentras con una situación que no se ajusta a ninguno de los algoritmos. Nunca necesitará escribir su propia implementación de árbol. Pero podría encontrarse, por ejemplo, necesitando aplanar una heirachy de listas doblemente vinculadas. En ese caso, haber entendido la idea básica detrás de la rotación puede ser muy útil.
fuente
Si está familiarizado con la programación funcional, puede encontrar este enfoque para ellos mejor (Okasaki 1999):
http://www.eecs.usma.edu/webs/people/okasaki/jfp99redblack.pdf
Si no, al menos anímate de la oración inicial:
fuente
No necesita comprender las rotaciones en detalle. Usted debe entender la relación entre los árboles y los árboles 2-3-4 RB (véase Sedgewick). Todas esas rotaciones locas tienen mucho más sentido cuando piensas en ellas como árboles 2-3-4. Si su profesor no ha enseñado árboles RB como un detalle de implementación para árboles 2-3-4, probablemente debería leer algo sobre árboles 2-3-4. (El tratamiento de Sedgewick es bastante bueno; Wikipedia no lo tiene).
En términos más generales, comprender los detalles de implementación de por qué funciona un algoritmo solo es a veces útil. Comprender la lógica de por qué funciona el algoritmo es casi siempre útil. Por lo general, no es necesario poder elaborar el algoritmo usted mismo, aunque cuantos más algoritmos comprenda, más posibilidades tendrá.
fuente
Si necesita "RB Trees By Heart" para su examen la próxima semana, tendrá que morder la bala y aprenderlos. En ese caso, debe reconsiderar sus métodos de aprendizaje. Quizás intentar explicar RB Trees a un compañero de clase te ayudará más que otra noche de escritura de código solitario.
Si los árboles RB son una base para su próximo curso después de las vacaciones, sáltelos ahora (sin malos sentimientos) y concéntrese en el curso de este semestre. Pero esté atento a los temas que podrían prepararlo para un segundo intento en RB Trees.
Si honestamente siente que nunca los necesitará realmente (vea el comentario de Anna Lear), despídase de ellos sin ningún remordimiento; nadie sabe más que una gota en el mar del conocimiento (lástima que los maestros a menudo piensen que su caída es más importante).
fuente
La clave para el éxito de la programación es nunca rendirse :
Hoy sus árboles RB mañana serán otra cosa. La lección más importante es no rendirse .
Para mí, esa es una de las esencias principales de la programación, no rendirse ...
Te sugiero que sigas intentándolo , y cuando falles, HAZLO DE NUEVO .
Porque una vez que superas las montañas, el cielo se aclara. Tu mente cambia en comprensión, estás temporalmente elevado (hasta la próxima montaña) . Esta elevación temporal vale más que todo el dinero del mundo.
fuente
La mejor manera de entenderlo es probarlo :
Así lo hicimos en la universidad. Y para el examen tuvimos que explicar cómo funcionaba una parte.
fuente