Documentos de Académico
Documentos de Profesional
Documentos de Cultura
3.2.2 Caso 2
3.2.3 Caso tres
3.2.4 Situación 4
3.2.5 Situación 5
3.2.6 Insertar resumen
3.3 Eliminar
3.3.1 Caso 1
3.3.2 Caso 2
3.3.6 Situación 6
3.3.7 Eliminar resumen
4. Resumen
referencia
Análisis detallado del árbol rojo-negro
2018-01-11 (/2018/01/11/红黑树详细分析/) Algoritmos fundamentales (/categories/basic-algorithm/) ► Buscar (/categories/basic-algorithm/search/)
Estructura de datos (/tags/数据结构/) , algoritmo (/tags/算法/) , árbol rojo-negro (/tags/红黑树/) (/2018/01/11/红黑树详细分析/#comments) comentario
(/2018/01/11/红黑树详细分析/#comments)
Anterior (/2018/01/11/TreeMap源码分析/)
Con las propiedades anteriores como limitaciones, se puede evitar la situación en la que el árbol de búsqueda binaria degenera en una lista enlazada
individualmente. Sin embargo, no basta con evitar esta situación, aquí tenemos que considerar la longitud de la ruta desde un determinado nodo hasta
cada uno de sus nodos hoja. Si la longitud de algunas rutas es demasiado larga, la eficiencia se reducirá en gran medida al agregar, eliminar y verificar las
órdenes en estas rutas. En este momento, se resalta el uso de las propiedades 4 y 5. Con estas dos propiedades como restricciones, se puede asegurar
que la ruta más larga desde cualquier nodo a cada nodo hoja no excederá el doble de la ruta más corta. Las razones son las siguientes:
Cuando un determinado camino es el más corto, este camino debe estar compuesto por nodos negros. Cuando la longitud de una determinada ruta es la
más larga, la ruta debe estar compuesta de nodos rojos y negros alternativamente (la propiedad 4 restringe que no puede haber dos nodos rojos
consecutivos). La propiedad 5 también define que todas las rutas desde cualquier nodo a cada uno de sus nodos hoja deben contener el mismo número
de nodos negros. En este momento, en el caso de la ruta más larga, el número de nodos rojos en la ruta = la cantidad de nodos negros. La longitud de la
ruta es el doble del número de nodos negros, que es el doble de la longitud de la ruta más corta. Para ver un ejemplo, vea la imagen a continuación:
Anterior (/2018/01/11/TreeMap源码分析/)
La imagen de arriba muestra las rutas más largas y más cortas desde el nodo raíz M hasta sus nodos hoja. Lazy here solo dibuja dos caminos más largos,
de hecho, hay 4 caminos más largos, respectivamente:
La longitud es 4, el camino más corto es M -> E y la longitud es 2. La longitud del camino más largo es exactamente el doble de la longitud del camino
más corto.
Mencioné algunas de las propiedades de los árboles rojo-negro, y hay algunas otras cosas que deben agregarse aquí. En la introducción a la sección del
árbol rojo-negro, no se llama cuando se inventó el árbol rojo-negro 红黑树 , pero se llama 对称二叉 B 树 . A partir del nombre, puede encontrar que el
árbol rojo-negro y el árbol B (aquí se refiere al árbol 2-3) puede tener ciertos Los hechos también son ciertos. Si la naturaleza del árbol rojo-negro se
modifica ligeramente, el árbol rojo-negro y el árbol B pueden formar una correspondencia uno a uno. Aquí no se explican los detalles de la relación entre
Anterior (/2018/01/11/TreeMap源码分析/)
el árbol rojo-negro y el árbol B. Quienes estén interesados pueden consultar la cuarta edición de "Algoritmo"
(https://book.douban.com/subject/19952400/) , que es muy completa.
La figura anterior contiene un diagrama esquemático de zurdos y diestros. Aquí, se utiliza como ejemplo diestro. Los pasos del nodo M para diestros son
los siguientes:
1. Apunte la referencia secundaria izquierda del nodo M al hijo derecho del nodo E
2. Apunte la referencia secundaria derecha del nodo E al nodo M para completar la rotación
Anterior (/2018/01/11/TreeMap源码分析/)
La operación para diestros se analiza arriba, y la operación para zurdos es similar a esta. Si estás interesado en hacer un dibujo tú mismo, pruébalo. No lo
repetiré aquí. La operación de rotación en sí no es complicada, así que analicémosla primero.
3.2 Insertar
El proceso de inserción del árbol rojo-negro es básicamente similar al proceso de inserción del árbol de búsqueda binaria. La diferencia es que después
de que el árbol rojo-negro inserta un nuevo nodo, es necesario ajustarlo para cumplir con la naturaleza del árbol rojo-negro. La propiedad 1 estipula que
el color del nodo del árbol rojo-negro es rojo o negro ¿Al insertar un nuevo nodo, este nodo debe ser rojo o negro? La respuesta es roja y la razón no es
difícil de entender. Si el nodo insertado es negro, entonces la ruta de este nodo tiene un nodo negro más que otras rutas. Este ajuste será más
problemático (consulte la operación de eliminación del árbol rojo-negro para saber por qué hay uno más o uno menos). nodo negro, ajuste Es muy
molesto levantarse). Si el nodo insertado es rojo, el número de nodos negros en todas las rutas permanece sin cambios y solo pueden aparecer dos
nodos rojos consecutivos. En este caso, puedes ajustarlo cambiando el color y girándolo, que es mucho más simple que antes.
A continuación, analizaremos el árbol rojo-negro después de insertar el nodo rojo. Supongamos aquí que el nodo que se va a insertar es N, el nodo padre
de N es P, el nodo abuelo es G y el nodo tío es U. Después de insertar el nodo rojo, habrá 5 situaciones, como sigue:
3.2.4 Situación 4
Anterior (/2018/01/11/TreeMap源码分析/)
El nodo padre de N es rojo y el nodo del tío es negro. El nodo N es el hijo derecho de P y el nodo P es el hijo izquierdo de G. En este momento, primero
gire el nodo P hacia la izquierda y ajuste las posiciones de N y P. A continuación, proceda según el caso 5 para restaurar la naturaleza 4.
3.2.5 Situación 5
El nodo padre de N es rojo y el nodo del tío es negro. N es el hijo izquierdo de P y el nodo P es el hijo izquierdo de G. En este momento, gire G hacia la
derecha, ajuste las posiciones de P y G e intercambie colores. Después de tales ajustes, Nature 4 se restauró sin destruir Nature 5.
La complejidad de la operación de eliminación del árbol rojo-negro radica en el color del nodo eliminado. Cuando el nodo eliminado es rojo, el nodo
secundario se puede usar directamente para llenar el espacio. Debido a que se elimina el nodo rojo, la propiedad 5 (todas las rutas simples desde
cualquier nodo a cada hoja contienen el mismo número de nodos negros) aún se puede satisfacer. Cuando el nodo eliminado es negro, entonces el
número de nodos negros en todas las rutas que pasan a través del nodo se reduce en uno, destruyendo la propiedad 5. Si el hijo del nodo es rojo,
reemplace el nodo eliminado con el nodo hijo directamente y tiñe el nodo hijo de negro para restaurar la propiedad 5. Pero si el nodo hijo es negro, será
mucho más complicado de manejar. Se divide en 6 situaciones, que se explicarán a continuación.
Antes de comenzar la explicación, hagamos algunas suposiciones para facilitar la explicación. Se supone aquí que el nodo final que se va a eliminar X (a
lo sumo sólo un nodo hijo), que es el nodo hijo N , X el nodo hermano S , S el nodo izquierdo es S L , el nodo derecho de S R & lt . La siguiente discusión
se basa en que el nodo X se elimina y el N reemplazo del nodo se X lleva a cabo. Aquí se explica que X la razón para eliminar el nodo eliminado
específicamente es para evitar que todos piensen erróneamente que el nodo N se eliminará; de lo contrario, no podrá entenderlo más tarde.
Sobre la base de lo anterior, la discusión puede comenzar a continuación. Hay 6 casos de eliminación de árboles rojo-negro, a saber:
3.3.1 Caso 1
N es la nueva raíz. En este caso, hemos terminado. Eliminamos un nodo negro de todas las rutas y la nueva raíz es negra, por lo que las propiedades
Anterior (/2018/01/11/TreeMap源码分析/)
permanecen.
Lo anterior es una descripción de la eliminación del árbol rojo-negro en Wikipedia. Como no hay imagen, es un poco mareado. Después de pensar, creo
que podría ser la siguiente situación:
El nodo X que se eliminará es el nodo raíz, y los nodos secundarios izquierdo y derecho son todos nodos vacíos. En este momento, reemplace el nodo X
con nodos vacíos para completar la operación de eliminación.
Puede haber otras situaciones, si lo sabe, hágamelo saber.
3.3.2 Caso 2
S es rojo y otros nodos son negros. En este caso, puede realizar una operación a la izquierda en el nodo principal de N y luego intercambiar los colores de
P y S. Pero esto no ha terminado, hay 3 nodos negros ( P -> X -> N ) antes de que se elimine la ruta a través de los nodos P y N , y ahora solo hay dos (
P -> N ). Hay un nodo negro menos que la ruta que no pasa por N, y la propiedad 5 aún no se satisface y se necesitan más ajustes. Pero en este
momento, se puede ajustar de acuerdo con las situaciones cuatro, cinco y seis.
Anterior (/2018/01/11/TreeMap源码分析/)
Como se muestra en la figura anterior, inserte el nodo N y trátelo de acuerdo con el caso tres. En este momento, P R se tiñe de rojo, formando un nodo
rojo continuo con el nodo P. En este momento, debe ajustarse nuevamente de acuerdo con la cuarta situación.
3.3.5 Situación 5
S es negro, el hijo izquierdo de S es rojo y el hijo derecho es negro. El color del nodo padre de N puede ser rojo o negro, y N es el hijo izquierdo de P. En
este caso, gire S hacia la derecha e intercambie los colores de S y S L. En este momento, el número de negros en todos los caminos sigue siendo igual, el
nodo hermano N cambia de S a S L y el hijo derecho de S L se vuelve rojo. A continuación, continuamos analizando el caso seis.
3.3.6 Situación 6
S es negro y el hijo derecho de S es rojo. El color del nodo padre de N puede ser rojo o negro, y N es el hijo izquierdo de su nodo padre. En este caso,
Anterior (/2018/01/11/TreeMap源码分析/)
realizamos una operación con la mano izquierda en P, intercambiamos los colores de P y S, y cambiamos S R a negro. Debido a que P se vuelve negro, hay
un nodo negro más en el camino a través de N, y el número de nodos negros en el camino a través de N es el mismo que el número antes de la
eliminación. Para un camino que no pasa por N, existen las siguientes dos situaciones:
1. Si esta ruta pasa por el nuevo nodo hermano S L de N , debe pasar antes por S y P. Y ahora S y P solo intercambian colores, lo que no afecta el camino a
través de S L.
2. El nuevo camino pasa por el nodo del tío N S R & lt , antes de que esté vinculado a través de ese P, S y S R & lt , pero ahora solo después de S y S R & lt .
Después de que P es zurdo y el color se cambia con S, en la ruta a través de S R falta un nodo negro y la propiedad 5 se rompe. Además, dado que el
color de S puede ser rojo o negro, si S es rojo, formará un nodo rojo continuo con S R , rompiendo la propiedad 4 (cada nodo rojo debe tener dos
nodos secundarios negros). En este momento, sólo es necesario cambiar S R de rojo a negro para restaurar tanto la propiedad 4 y la propiedad 5
(todos los caminos sencillos de cualquier nodo para cada hoja contener el mismo número de nodos negros.).
Anterior (/2018/01/11/TreeMap源码分析/)
Anterior (/2018/01/11/TreeMap源码分析/)
4. Resumen
El árbol rojo-negro es un árbol binario importante, que se usa ampliamente, pero no aparece muchas veces en muchos libros relacionados con la
estructura de datos. Muchos libros no hablan de ello o simplemente lo cubren de un solo golpe, sin un análisis detallado, esto puede deberse a que el
árbol rojo-negro es más complicado. También encontré mucha información cuando estaba estudiando Red-Black Tree, pero la sensación general no era
muy buena. Especialmente cuando estaba aprendiendo la operación de eliminación, mucha información era realmente ilegible y me resultaba doloroso
leerla. Hasta que vi el análisis de árboles rojo-negro (https://en.wikipedia.org/wiki/Red%E2%80%93black_tree) en Wikipedia , estaba muy feliz. El análisis
de este artículo es muy metódico, conciso y mucho mejor que mucha información. El análisis del árbol rojo-negro en este artículo también se refiere
principalmente al análisis del árbol rojo-negro en Wikipedia, y explica los lugares en Wikipedia que son propensos a dudas y malentendidos. Al mismo
tiempo, la imagen en el texto del árbol rojo-negro de la versión china de Wikipedia está borrosa, así que la volví a dibujar aquí. Cabe señalar que la
versión china de Wikipedia no se puede abrir y que los enlaces a Wikipedia en el texto están todos en inglés. Además, recomiendo un sitio web de
visualización de la estructura de datos, que contiene un proceso común de visualización de la estructura de datos, la dirección es: t.cn/RZFgryr
(https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) .
Además, debido a que el árbol rojo-negro en sí es más complicado, su implementación también es más complicada. Antes de escribir este artículo, traté
de usar el lenguaje Java para implementar operaciones de adición y eliminación de árboles rojo-negro. Al final, solo escribí la operación del nuevo nodo,
pero la eliminación no se realizó. Además, la nueva lógica escrita por mí es demasiado engorrosa, y la escritura no es bonita y es imposible demostrarlo.
Así que al final, copié el código fuente relevante de TreeMap en Java, modifiqué el código fuente de acuerdo con mis propias necesidades y apenas me di
cuenta del árbol rojo-negro. El código se coloca en github, Portal -> RBTree.java
(https://github.com/code4wt/basic_algorithm/blob/master/src/main/java/search/RBTree.java) .
Finalmente, si también está aprendiendo sobre árboles rojo-negros, espero que este artículo pueda ayudarlo. Además, debido a la complejidad del árbol
rojo-negro en sí y al nivel limitado de la persona, inevitablemente se producirán algunos errores. Si hay un error, espero que todos lo señalen y lo
discutiremos juntos.
referencia
"Algoritmo" Cuarta edición (https://book.douban.com/subject/19952400/)
Árbol rojo-negro - Wikipedia (https://en.wikipedia.org/wiki/Red%E2%80%93black_tree)
(http://creativecommons.org/licenses/by-nc-nd/4.0/)
Esta obra está autorizada bajo el Acuerdo de licencia internacional Creative Commons Reconocimiento-Uso no comercial-Sin deducción 4.0
(http://creativecommons.org/licenses/by-nc-nd/4.0/) .
Descargo de responsabilidad: este artículo de blog, a menos que se especifique lo contrario, utiliza el Acuerdo de
(http://creativecommons.org/licenses/by-nc-nd/4.0/) licencia internacional de atribución - No comercial - Sin obras derivadas 4.0 de Creative
Commons (http://creativecommons.org/licenses/by-nc-nd/4.0/) . ¡Indique la fuente!
Anterior (/2018/01/11/TreeMap源码分析/)