¿Está bien no entender completamente los árboles RB? [cerrado]

15

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)

Bernardo Pires
fuente
18
"Joven, en matemáticas no entiendes las cosas. Simplemente te acostumbras a ellas". - John von Neumann
2
@Clash ¿En qué contexto? No creo que haya necesitado saber cómo funcionan los árboles RB en un entorno profesional, pero eso puede variar según lo que quieras hacer. Yo diría que estás bien para saltearlos hasta que los necesites.
Adam Lear
44
@Clash Me molesta enormemente que digas que es "trampa" implementar cualquier cosa con la orientación de una fuente externa. El pseudocódigo existe por una razón: eliminan la necesidad de hacerlo de la memoria. Estoy completamente de acuerdo con Winston: comprender y conocer de memoria son dos cosas diferentes mutuamente excluyentes. Memorizar! = Comprensión y comprensión! = Memorizar.
doppelgreener
3
Está bien no preocuparse realmente por los árboles RB, ¿hasta que los necesite?
Steven A. Lowe,
1
Quizás entienda CUANDO debe usar árboles RB, en lugar de todos los otros tipos de implementación de árbol. Sepa qué problemas resuelven y todas las razones para elegir los árboles RB. Pero si alguna vez tiene que implementar uno (fuera de un examen, por supuesto), podrá buscarlo; Entonces, ¿por qué molestarse en saber cómo hacerlo de memoria?
Dawood dice reinstalar a Mónica el

Respuestas:

13

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.

Winston Ewert
fuente
2
'Pareces equiparar la idea de "entender" con "poder escribir el código sin mirar el libro". Estas son dos cosas diferentes.' Err ... no. Si está escribiendo esto, probablemente significa que no ha estudiado matemáticas mucho más allá de un año o dos de la universidad, incluso si eso es así. En algún momento, "comprender" las matemáticas (que, por cortesía de Turing, equivale a computación) solo se trata de poder demostrar lo que has "entendido". No hay solución o ifs o maybes o foo o bar o baz. En ese nivel, si no puedes probar tu afirmación matemática, estás tostado. (A menos que se
llame
14
@ Dennis, tengo una maestría en CS con una cantidad superior a la media de cursos de matemáticas para la especialización. Me temo que no has entendido mi punto. Ser capaz de demostrar o demostrar lo que entiendes es muy importante. Ser capaz de memorizar los detalles de una prueba o método no lo es. DEBERÍA poder escribir el código. Pero no veo ningún uso para el requisito de poder escribir el código desde MEMORY.
Winston Ewert
2
Tenga cuidado donde lo busca también: IIRC, algunos libros de texto tienen errores significativos en sus algoritmos de árbol rojo-negro.
Steve314
2
@ Steve314, ¡ni siquiera necesitas entender a RB para ser un autor de libros de texto! ;)
Winston Ewert
Gracias Winston, ¡esto me alivia! Solo hay un par de cosas que no entendí con el código que podría publicar en un futuro cercano. Pero estoy muy contento de que esté bien no entender (por entender me refiero a escribir el código sin hacer trampa) por qué / cómo alguien notó los 3/6 casos para la inserción y 4/8 casos para la eliminación.
Bernardo Pires
4

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:

Todos aprenden sobre los árboles de búsqueda binarios balanceados en sus clases introductorias de ciencias de la computación, pero incluso los valientes tiemblan ante la idea de implementar tal bestia.

Ryan Culpepper
fuente
Jajaja ryan! ¡Eso me alivia! ¡Muchas gracias! Hoy también noté que hay muy pocas preguntas sobre SO sobre RB-Trees. Así que supongo que son realmente difíciles.
Bernardo Pires
2
Creo que es solo eso, aparte de los estudiantes universitarios de CS, son el tipo de cosas que se implementan aproximadamente una vez por lenguaje de programación. (O menos. Creo que el código RB más popular para Scheme fue portado del código RB para OCaml.)
Ryan Culpepper
El enlace está roto: espejo 1 , espejo 2 . Cita completa en caso de que ambos espejos no estén disponibles en algún momento en el futuro: Chris Okasaki, "Árboles rojo-negros en un entorno funcional", Journal of Functional Programming, 9 (4), pp471-477, julio de 1999.
Snowball
3

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á.

Rex Kerr
fuente
1

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).

Ekkehard.Horner
fuente
1

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 .

"Hasta que llegue, hasta que haga clic, hasta que se ejecute".

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.

Noche oscura
fuente
Gracias, este era exactamente mi miedo! Si renuncio a esto, ¿qué me impide renunciar a lo siguiente? Es por eso que desperdicié casi todo un día solo para entender la inserción y eliminación.
Bernardo Pires
Nunca es un desperdicio, créame cuando hace "clic" en la elevación más que compensa todo el sudor y las lágrimas.
Darknight
0

La mejor manera de entenderlo es probarlo :

  • Hay 3 o 6 rotaciones. Tome un pedazo de papel y escríbalos uno por uno.
  • Una vez que lo consigas, ve e implementa un Árbol Negro Rojo. Está bien si tienes que buscar algunas cosas.

Así lo hicimos en la universidad. Y para el examen tuvimos que explicar cómo funcionaba una parte.

Carra
fuente