Introducción a los árboles rojo-negros y a los zurdos, a los diestros y a la decoloración.

Introducción a los árboles rojo-negros y a los zurdos, a los diestros y a la decoloración.

Red Black Tree (Red Black Tree) es un árbol de búsqueda binario autoequilibrado (árbol de búsqueda binario), un árbol de búsqueda binario especial que mantiene el equilibrio del árbol binario a través de operaciones específicas al insertar y eliminar. Obtenga un alto rendimiento de búsqueda.

La operación de equilibrado del árbol rojo-negro se realiza mediante zurdos, diestros y cambiando de color. El proceso de equilibrado es más complicado, pero a través de la operación de equilibrado, se puede obtener un rendimiento más eficiente. Después de equilibrar el árbol de búsqueda binaria, se optimiza el tiempo de ejecución del peor de los casos. La búsqueda, inserción y eliminación se pueden completar dentro de O (logN) complejidad de tiempo, donde N es el número de nodos en el árbol de búsqueda binaria.

1. Análisis de rendimiento del árbol de búsqueda binario

El árbol rojo-negro es un árbol de búsqueda binario especial, por lo que este artículo comienza con un árbol de búsqueda binario.

El árbol de búsqueda binaria es un árbol binario especial con las siguientes características:

1. Si el subárbol izquierdo del árbol binario no está vacío, los valores de todos los nodos del subárbol izquierdo son menores que el valor de su nodo raíz.

2. Si el subárbol derecho del árbol binario no está vacío, los valores de todos los nodos del subárbol derecho son mayores que el valor de su nodo raíz.

3. Si lo observa de forma independiente, el subárbol izquierdo y el subárbol derecho también son árboles de búsqueda binarios.

Para la realización del árbol de búsqueda binaria, consulte: https://blog.csdn.net/weixin_43790276/article/details/105753543

Al insertar datos en un árbol de búsqueda binaria, para cumplir con las características del árbol de búsqueda binaria, el valor del nodo insertado y el valor del nodo raíz se comparan de forma recursiva y los datos se insertan en la posición correcta.

Por ejemplo, inserte [50, 77, 55, 29, 10, 30, 66, 80, 51, 18, 90] en un árbol de búsqueda binario vacío, la estructura del árbol de búsqueda binaria es la siguiente:

Se puede ver en el diagrama de estructura que este árbol de búsqueda binaria está equilibrado. Cuando busque datos en el árbol de búsqueda binaria, de acuerdo con la idea de la búsqueda binaria, comience desde el nodo raíz y luego busque en el subárbol. Si hay es no Cuando se encuentran los datos del objetivo, buscará en el siguiente nivel del árbol cada vez, y el número máximo de búsquedas requeridas es igual a la profundidad del árbol. El peor caso es encontrar el nivel más profundo del árbol, por lo que el peor caso para buscar en este árbol es buscar 4 veces.

Aún así, los datos del ejemplo anterior, asumiendo que los datos más grandes que el nodo raíz 50 están dispuestos en orden ascendente, como [50, 51, 55, 66, 77, 80, 90, 29, 10, 30, 18], que es más pequeño que el nodo raíz 50 El orden de los datos permanece sin cambios, inserte estos datos en el árbol de búsqueda binaria, la estructura del árbol de búsqueda binaria resultante es la siguiente:

Obviamente, este árbol de búsqueda binario está desequilibrado. El peor caso de búsqueda de datos en este árbol requiere de 7. La razón del gran número de búsquedas es el desequilibrio del árbol, y el subárbol derecho se ha extendido en profundidad. Si se eliminan el nodo raíz y el subárbol derecho, la estructura es la siguiente:

 

Según el diagrama de estructura, este es un árbol inclinado hacia la derecha. Aunque es un árbol binario, se parece más a una lista enlazada, que está "retrocediendo" a una lista enlazada. La complejidad temporal de la lista vinculada es O (N) y la complejidad temporal del árbol binario equilibrado es O (logN). Cuando N es grande, la brecha de rendimiento entre O (N) y O (logN) es muy grande.

Se puede ver que el orden de inserción del árbol de búsqueda binaria afectará la estructura del árbol, lo que afectará el rendimiento. Para el ejemplo anterior, solo hay 11 nodos en total, y es poco probable que se organicen 7 datos en secuencia, pero en escenarios de aplicación reales, puede haber 110, 11,000, 11,000,000 o incluso más nodos. Cuando aumenta la cantidad de datos, existe una alta posibilidad de que uno o más fragmentos de datos se organicen en secuencia en estos datos, lo que hará que el árbol de búsqueda binaria esté extremadamente desequilibrado, degenere en la lista enlazada y reduzca en gran medida la rendimiento.

Por lo tanto, mantener el equilibrio del árbol de búsqueda binaria juega un papel vital para garantizar el rendimiento. Dado que los datos cambian dinámicamente, aumentarán o disminuirán dinámicamente y es imposible controlar el orden de los datos antes de construir el árbol de búsqueda binaria. Para mantener el equilibrio del árbol de búsqueda binaria, es necesario mantener el equilibrio cada vez que se agrega un nodo o cada vez que se reduce un nodo, es decir, el árbol de búsqueda binaria se mantiene siempre en equilibrio, de modo que el rendimiento del El árbol de búsqueda binaria no puede degradarse a la lista enlazada.

Cuando cambia el número de nodos en el árbol de búsqueda binario, se utilizan algunas estrategias para mantener el equilibrio. El árbol rojo-negro es un árbol binario.

2. Introducción al árbol rojo-negro

El árbol rojo-negro es un árbol de búsqueda binario autoequilibrado, cada nodo tiene un color, el color es rojo o negro y el árbol rojo-negro recibe su nombre. Además de satisfacer las características de los árboles de búsqueda binaria, los árboles rojo-negro también tienen las siguientes características:

1. El nodo es rojo o negro.

2. El nodo raíz es negro.

3. Todos los nodos hoja son nodos vacíos negros. (Los nodos hoja son nodos NIL o nodos NULL)

4. Los dos nodos secundarios de cada nodo rojo son nodos negros. (No puede haber dos nodos rojos consecutivos en todas las rutas desde cada nodo hoja hasta la raíz)

5. Todas las rutas desde cualquier nodo a cada uno de sus nodos hoja contienen el mismo número de nodos negros.

Para saber qué es un árbol rojo-negro, debes recordar estas 5 características. Estas 5 características son en realidad 5 regulaciones, y solo cuando se cumplen estas 5 regulaciones pueden pertenecer a un árbol rojo-negro. Para las características del árbol de búsqueda binaria, siempre que lo entienda, es fácil de recordar, pero para las cinco características de los árboles rojo-negro, necesita "memorizarlo de memoria".

Al igual que el árbol de búsqueda binaria en el ejemplo anterior, puede agregar colores para convertirse en un árbol rojo-negro. (El árbol rojo-negro real se inserta un nodo por un nodo. El siguiente proceso de construcción es solo para comprender primero las 5 características del árbol rojo-negro)

1. Agregue primero los nodos de hoja y marque todos los nodos como negros.

2. Este árbol binario obviamente no cumple con las características del árbol rojo-negro 5. Por ejemplo, hay un nodo negro en la ruta desde el nodo 10 al nodo hoja del subárbol izquierdo, y hay dos nodos negros en la ruta al nodo hoja del subárbol derecho, así que convierta algunos nodos negros en nodos rojos.

A partir del nodo raíz 50, hay 4 nodos negros en la ruta desde el nodo raíz hasta cada nodo hoja, y el árbol rojo-negro resultante es el siguiente.

Por supuesto, también es posible tener 3 nodos negros en la ruta desde el nodo raíz hasta cada nodo hoja, y el árbol rojo-negro resultante es el siguiente.

Ahora veamos si estos dos árboles cumplen con las cinco características de los árboles rojo y negro. Puedes compararlos uno por uno. En cuanto al proceso de construcción, no nos importa (esto es en realidad una forma rígida) y hablaremos de cómo construirlo más adelante.

De acuerdo con la característica 5 del árbol rojo-negro, el número de nodos negros en el camino desde cualquier nodo a todos sus nodos foliares es el mismo, para mantener el equilibrio del árbol rojo-negro. Si solo observa los nodos negros, este equilibrio es un equilibrio perfecto, por lo que el equilibrio de los árboles rojos y negros también se llama equilibrio perfecto negro. Por supuesto, debido a la existencia de nodos rojos, los árboles rojo-negro no están perfectamente equilibrados y es posible que ni siquiera satisfagan las características de los árboles binarios equilibrados.

Cuando se inserta o elimina un nodo en el árbol rojo-negro, es probable que se destruya el equilibrio del árbol rojo-negro (una o más de las características no se satisfacen). El árbol rojo-negro debe ajustarse inmediatamente para hacer el árbol rojo-negro vuelve a encontrar 5. Características del artículo.

Las operaciones para ajustar el equilibrio incluyen cambio de color a la izquierda, a la derecha y que se describen a continuación.

En tercer lugar, la operación de la mano izquierda y la mano derecha del árbol rojo-negro

Para un árbol rojo-negro, satisface las cinco características de un árbol rojo-negro. Después de insertar o eliminar nodos, el árbol rojo-negro ha cambiado. Es muy probable que las cinco características del árbol rojo-negro ya no estén completamente satisfechas, es decir, ya no es un árbol rojo-negro, sino un árbol normal. árbol de búsqueda binaria. En este momento, para que el árbol de búsqueda binario se convierta nuevamente en un árbol rojo-negro, es necesario operar el árbol de búsqueda binaria para satisfacer las cinco características del árbol rojo-negro.

Al rotar, el árbol de búsqueda binaria puede volver a satisfacer las cinco características del árbol rojo-negro. La rotación se divide en diestros y zurdos.

1. La mano izquierda del árbol rojo-negro

Zurdo: tome un nodo como pivote (nodo de rotación), su nodo hijo derecho se convierte en el nodo padre del nodo de rotación, el nodo hijo izquierdo del nodo hijo derecho se convierte en el nodo hijo derecho del nodo de rotación y el izquierdo El nodo hijo del nodo de rotación permanece sin cambios. El nodo hijo izquierdo del nodo hijo derecho es equivalente a "desconectarse" del nodo hijo derecho y volver a conectarse al nodo giratorio.

En aras de la generalidad, puede ver el ejemplo de la figura siguiente. A la izquierda está la estructura parcial del árbol rojo-negro en pronación zurda, primero no se considera el todo, solo la parte, la pronación zurda no satisface las características del árbol rojo-negro5.

Cuando se gira hacia la izquierda, el nodo giratorio es el nodo 50. Después de girar a la izquierda, el nodo secundario derecho 70 del nodo giratorio se convierte en el nodo principal del nodo giratorio 50, y el nodo secundario izquierdo 60 del nodo secundario derecho es "desconectado" del nodo secundario derecho 70 y se convierte en el nodo giratorio El nodo secundario derecho de 50.

Después de ser zurdo, la estructura es como se muestra en la figura de la derecha, esta parte vuelve a satisfacer la característica 5 del árbol rojo-negro para lograr el objetivo.

Observa otro ejemplo de rotación a la izquierda. El lado izquierdo es la estructura local antes de la rotación a la izquierda. El nodo 10 se utiliza como nodo giratorio. Después de la rotación a la izquierda, el nodo secundario derecho 20 del nodo giratorio se convierte en el nodo principal del nodo rotatorio 10, y el nodo hijo izquierdo del nodo hijo derecho (aquí es un nodo hoja (NIL) "desconectado" del nodo hijo derecho y se convierte en el nodo hijo derecho del nodo rotatorio 10.

2. Rotación derecha del árbol rojo-negro

Rotación a la derecha: tome un nodo como punto de apoyo (nodo de rotación), su nodo hijo izquierdo se convierte en el nodo padre del nodo de rotación, el nodo hijo derecho del nodo hijo izquierdo se convierte en el nodo hijo izquierdo del nodo de rotación y el hijo derecho El nodo del nodo de rotación permanece sin cambios. El nodo hijo derecho del nodo hijo izquierdo es equivalente a "desconectarse" del nodo hijo izquierdo y volver a conectarse al nodo giratorio.

No es difícil ver que la mano izquierda y la derecha son opuestas y reversibles.

El ejemplo de la figura siguiente sigue siendo parte del árbol rojo-negro y la estructura de la izquierda no cumple las características del árbol rojo-negro 5.

Cuando se gira hacia la derecha, el nodo giratorio es el nodo 70. Después de girar hacia la derecha, el nodo secundario izquierdo 50 del nodo giratorio se convierte en el nodo principal del nodo giratorio 70, y el nodo secundario derecho 60 del nodo secundario izquierdo es "desconectado" del nodo hijo izquierdo 50, convirtiéndose en Rota el nodo hijo izquierdo del nodo 70. Después de girar a la derecha (imagen de la derecha), la característica 5 del árbol rojo-negro vuelve a cumplirse.

Mire también un ejemplo de rotación a la derecha. A la izquierda está la estructura local antes de la rotación a la derecha, con el nodo 30 como el nodo giratorio. Después de la rotación a la derecha, el nodo secundario izquierdo 20 del nodo giratorio se convierte en el padre nodo del nodo giratorio 30, y el hijo derecho del nodo hijo izquierdo El nodo (aquí, un nodo hoja NIL) se "desconecta" del nodo hijo izquierdo y se convierte en el nodo hijo izquierdo del nodo 30 giratorio.

A través de la introducción y ejemplos de zurdos y diestros, el propósito de zurdos y diestros es hacer que el árbol de búsqueda binaria vuelva a satisfacer las características del árbol rojo-negro rotando los nodos. y diestros son mutuamente inversos, de acuerdo con diferentes situaciones Utilice diferentes métodos de rotación.

Cuarto, la operación de cambio de color del árbol rojo-negro.

Después de insertar o eliminar nodos en el árbol rojo-negro, si las cinco características del árbol rojo-negro ya no se satisfacen completamente, además de la rotación, el cambio de color también puede hacer que el árbol de búsqueda binaria cumpla con las cinco características del árbol rojo-negro. árbol negro de nuevo.

Decoloración: cambia el color del nodo de rojo a negro o de negro a rojo.

Al insertar un nodo en el árbol rojo-negro, el color del nuevo nodo se establece en rojo. Independientemente del color del nuevo nodo, la característica 3 no se puede destruir y las características 1, 2 y 4 se pueden destruir. Si el nodo insertado es negro, la característica 5 debe destruirse y se necesitan ajustes Si el nodo insertado es rojo, la característica 5 no debe destruirse. Por lo tanto, configurar el nuevo nodo en rojo puede reducir la posibilidad de destruir las características del árbol rojo-negro.

1. Agregar nodo

La siguiente imagen de la izquierda es una parte del árbol rojo-negro. Al principio, satisface las características del árbol rojo-negro. El nodo rojo 10 se inserta en él. Los dos nodos rojos están conectados entre sí y ya no satisfacen las características del árbol rojo-negro.

Mediante el cambio de color, el nodo 20 se cambia primero a negro y se satisface la característica 4, pero no se satisface la característica 5, por lo que el nodo 30 se cambia a rojo y el nodo 40 se cambia a negro.

Después de 3 veces de decoloración, desde una perspectiva local, las características del árbol rojo-negro se han satisfecho nuevamente. Sin embargo, desde la perspectiva de todo el árbol, las características del árbol rojo-negro no están necesariamente satisfechas. Si el nodo padre del nodo 30 también es rojo, es necesario continuar ajustando el árbol (el lado izquierdo y el derecho Los ejemplos de manos anteriores también tienen este Acontecimiento).

2. Eliminar nodo

La siguiente imagen de la izquierda es parte del árbol rojo-negro. Al principio, satisface las características del árbol rojo-negro. Después de eliminar el nodo 90, ya no cumple con las características del árbol rojo-negro 5.

A través del cambio de color, el nodo 80 se cambia primero a negro, pero la característica 5 todavía no se satisface, y el nodo 70 se continúa cambiando a rojo, satisfaciendo de nuevo las características del árbol rojo-negro.

Después de dos cambios de color, se vuelven a satisfacer las características del árbol rojo-negro, para este ejemplo, siempre que se cumpla la satisfacción parcial, todo el árbol debe coincidir con el árbol rojo-negro.

Quinto, el caso completo de la rotación y decoloración del árbol rojo-negro.

Cuando la rotación y la decoloración se introducen anteriormente, se analizan de forma independiente. Ambos métodos de ajuste pueden hacer que el árbol rojo-negro cuyas reglas se rompan nuevamente cumpla con las características del árbol rojo-negro. Más a menudo, es necesario utilizarlo de manera flexible para hacer el ajuste más eficiente.

Veamos un ejemplo sencillo. Utilice el árbol rojo-negro al principio del artículo, la estructura es como se muestra en la figura siguiente.

1. Inserte el nodo 20 en el árbol rojo-negro, que no cumple con las características del árbol rojo-negro 4.

2. Cambie el nodo 18 de rojo a negro, y no cumple con las características del árbol rojo-negro 5.

3. Utilice el nodo 18 como nodo giratorio y realice la rotación a la izquierda. Después de la rotación a la izquierda, todavía no está satisfecho con las características del árbol rojo-negro 5.

4. Cambie el nodo 10 de negro a rojo, y después de cambiar el color, las 5 características del árbol rojo-negro quedan satisfechas nuevamente.

Después de tres pasos de cambio de color, rotación a la izquierda y cambio de color, el árbol después de insertar el nodo se convierte nuevamente en un árbol rojo-negro.

El diagrama de estructura ejemplificado en este artículo es para facilitar la comprensión del árbol rojo-negro y la rotación y decoloración del árbol rojo-negro. Se obtiene un verdadero árbol rojo-negro insertando los nodos uno por uno, y estas estructuras en el Se obtendrá el gráfico anterior. Para la inserción, eliminación e implementación del código del árbol rojo-negro, se continuarán introduciendo otros artículos en esta columna.

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43790276/article/details/106042360
Recomendado
Clasificación