Articulo de referencia

Árbol WAVL

O(\\log n) "},"insert_worst":{"wt":" O(\\log n) "},"delete_worst":{"wt":" O(\\log n) "},"space_worst":{"wt":" O(n) "},"space_avg":{"wt":" O(n) "},"search_avg":{"wt":" O(\\log n)...

En informática , un árbol WAVL o árbol AVL débil es un árbol de búsqueda binaria autoequilibrado . Los árboles WAVL reciben su nombre de los árboles AVL , otro tipo de árbol de búsqueda equilibrado, y están estrechamente relacionados tanto con los árboles AVL como con los árboles rojo-negro , que se engloban dentro de un marco común de árboles equilibrados por rango . Al igual que otros árboles de búsqueda binaria equilibrados, los árboles WAVL pueden gestionar operaciones de inserción, eliminación y búsqueda en tiempo O (log n ) por operación. [ 1 ] [ 2 ]

Los árboles WAVL están diseñados para combinar algunas de las mejores propiedades de los árboles AVL y los árboles rojo-negro. Una ventaja de los árboles AVL sobre los árboles rojo-negro es que son más equilibrados: tienen altura en la mayoría de los casos.registroφnorte1.44registro2norte{\displaystyle \log _{\varphi }n\approx 1.44\log _{2}n}(para un árbol con n elementos de datos, dondeφ{\displaystyle \varphi }es la proporción áurea ), mientras que los árboles rojo-negro tienen una altura máxima mayor,2registro2norte{\displaystyle 2\log _{2}n}Si un árbol WAVL se crea utilizando solo inserciones, sin eliminaciones, entonces tiene el mismo límite de altura pequeño que un árbol AVL. Por otro lado, los árboles rojo-negro tienen la ventaja sobre los árboles AVL de requerir una menor reestructuración. En los árboles AVL, cada eliminación puede requerir un número logarítmico de rotaciones , mientras que los árboles rojo-negro tienen operaciones de eliminación más simples que utilizan solo un número constante de rotaciones. Los árboles WAVL, al igual que los árboles rojo-negro, utilizan solo un número constante de rotaciones, y esta constante es incluso mejor que para los árboles rojo-negro. [ 1 ] [ 2 ]

Los árboles WAVL fueron introducidos por Haeupler, Sen y Tarjan (2015) . Los mismos autores también proporcionaron una visión común de los árboles AVL, los árboles WAVL y los árboles rojo-negro como un tipo de árbol de rango equilibrado. [ 2 ]

Marco de árboles equilibrados por rango

Los distintos árboles de búsqueda binaria emplean diferentes algoritmos de inserción/eliminación y de balanceo, lo que dificulta su estudio sistemático. Los autores de Haeupler, Sen y Tarjan (2015) introducen el marco de árboles balanceados por rango para unificar el estudio de los árboles de búsqueda binaria, definiendo el árbol binario de rango. Cada árbol de búsqueda binaria se ve afectado por restricciones específicas aplicadas a la función de rango. Cabe destacar que este marco no especifica los algoritmos de implementación de estos árboles.

Un árbol binario de rango es un árbol binario donde cada nodo x está asociado con un rango r(x). Por convención, un nodo vacío tiene rango -1. Para un nodo x que no es la raíz, la diferencia de rango esr(pag(incógnita))r(incógnita){\displaystyle r(p(x))-r(x)}, y dicho nodo se denomina hijo i si la diferencia de rango es i. Un nodo es de tipoi,j{\displaystyle i,j}si la diferencia de rango de su hijo izquierdo y su hijo derecho es i y j (sin tener en cuenta el orden).

Con ello, podemos definir reglas adicionales que corresponden a diferentes árboles:

  • Regla AVL, que corresponde al árbol AVL : cada nodo es de tipo 1,1 o 1,2.
  • Regla 2-3, que corresponde al árbol 2-3 binarizado: cada nodo es de tipo 0,1 o 1,1, y ningún padre de un hijo 0 es un hijo 0.
  • Regla rojo-negro, que corresponde al árbol rojo-negro : todas las diferencias de rango son 0 o 1, y ningún padre de un hijo 0 es un hijo 0. Cabe destacar que la regla rojo-negro generaliza la regla 2-3 al permitir nodos de tipo 0,0.

Hasta ahora, todas estas reglas son simétricas para el nodo izquierdo y el nodo derecho. Al romper dichas simetrías, surgen otras reglas:

  • Regla Dos-Tres con Inclinación a la Derecha, que corresponde al árbol binario 2-3 con inclinación a la derecha: Cada nodo es 1,1 o 0,1, ningún padre de un hijo 0 es un hijo 0, y no queda ningún hijo 0.
  • Regla Dos-Tres de Inclinación Izquierda, que corresponde al árbol binario 2-3 de inclinación izquierda: Cada nodo es 1,1 o 0,1, ningún padre de un hijo 0 es un hijo 0, y ningún hijo 0 es derecho.
  • Regla rojo-negro de inclinación derecha, que corresponde al árbol rojo-negro de inclinación izquierda: ningún padre de un hijo 0 es un hijo 0, y no queda ningún hijo 0 de un nodo 0,1.
  • Regla rojo-negro de inclinación izquierda, que corresponde al árbol rojo-negro de inclinación izquierda : todas las diferencias de rango son 0 o 1, ningún padre de un hijo 0 es un hijo 0, y ningún hijo 0 de un nodo 0,1 es derecho.

El árbol AVL débil se define mediante la regla AVL débil:

  • Regla AVL débil: todas las diferencias de rango son 1 o 2, y todos los nodos hoja tienen rango 0.

Cabe destacar que el árbol AVL débil generaliza el árbol AVL al permitir nodos de tipo 2,2. Una demostración sencilla muestra que un árbol AVL débil puede colorearse de forma que represente un árbol rojo-negro. Por lo tanto, en cierto modo, el árbol AVL débil combina las propiedades del árbol AVL y del árbol rojo-negro.

Definición

Al igual que los árboles de búsqueda binaria en general, un árbol WAVL consta de una colección de nodos de dos tipos: nodos internos y nodos externos. Un nodo interno almacena un dato y está vinculado a su padre (excepto un nodo raíz designado que no tiene padre) y a exactamente dos hijos en el árbol: el hijo izquierdo y el hijo derecho. Un nodo externo no contiene datos y solo está vinculado a su padre en el árbol. Estos nodos están dispuestos para formar un árbol binario, de modo que para cualquier nodo interno x, los padres de los hijos izquierdo y derecho de x son el propio x . Los nodos externos forman las hojas del árbol. [ 3 ] Los datos están organizados en el árbol de tal manera que un recorrido en orden del árbol los lista en orden ascendente. [ 4 ]

Lo que distingue a los árboles WAVL de otros tipos de árboles de búsqueda binaria es el uso de rangos . Estos son números, asociados a cada nodo, que proporcionan una aproximación a la distancia desde el nodo hasta su descendiente hoja más lejano. A diferencia de los árboles AVL, donde los rangos se definen como iguales a las alturas de los nodos, en los árboles WAVL los rangos no siempre son iguales a las alturas. La diferencia de rango del nodo x se define como la diferencia entre el rango del padre de x y el rango de x. Los rangos deben cumplir las siguientes propiedades: [ 1 ] [ 2 ]

  • Propiedad del nodo externo: Cada nodo externo tiene rango 0 [ 5 ]
  • Propiedad de diferencia de rango: Si un nodo que no es la raíz tiene rango r , entonces el rango de su padre debe ser r + 1 o r + 2. En otras palabras, la diferencia de rango para cualquier nodo que no sea la raíz es 1 o 2. [ 1 ]
  • Propiedad de nodo interno: Un nodo interno con dos hijos externos debe tener rango exactamente 1.

Operaciones

Búsqueda

La búsqueda de una clave k en un árbol WAVL es muy similar a la de cualquier estructura de datos de árbol de búsqueda binaria balanceada. Se comienza en la raíz del árbol y se compara repetidamente k con el dato almacenado en cada nodo a lo largo de una ruta desde la raíz. Si k es menor que el valor en el nodo, se sigue la ruta hacia el hijo izquierdo, o hacia el hijo derecho, si k es mayor. Cuando se alcanza un nodo con un valor igual a k , o un nodo externo, la búsqueda finaliza. [ 6 ]

Si la búsqueda se detiene en un nodo interno, se ha encontrado la clave k . Si, por el contrario, la búsqueda se detiene en un nodo externo, entonces se ha encontrado la posición donde se insertaría k (si se insertara). [ 6 ]

Inserción

La inserción de un nodo interno con clave k en un árbol WAVL requiere una búsqueda de k en el árbol, que finaliza en un nodo externo; luego, la sustitución de dicho nodo externo por el nuevo nodo interno con dos hijos externos; y, finalmente, el reequilibrio del árbol. El reequilibrio puede realizarse de arriba hacia abajo o de abajo hacia arriba, [ 2 ] pero la versión de abajo hacia arriba es la que más se asemeja a los árboles AVL. [ 1 ] [ 2 ]

El reequilibrio ascendente comienza considerando la diferencia de rango entre un nodo (inicialmente el nodo recién insertado) y su padre. Si no hay padre, se restablece el equilibrio. Antes de la inserción, la diferencia de rango entre el padre y el nodo era de 1 o 2, pero esta se ha reducido en 1 debido a que el subárbol con raíz en el nodo ha crecido. Si la nueva diferencia de rango entre el padre y el nodo es 1, se restablece el equilibrio. De lo contrario, si el hermano (el otro hijo del padre) tiene una diferencia de rango de 1 con el padre, se promueve al padre (se aumenta su rango incrementando las diferencias de rango entre él y cada uno de sus hijos) y se continúa el reequilibrio con el antiguo padre como nuevo nodo.

Finalmente, con diferencias de rango de 0 y 2 para el nodo y su hermano, una o dos rotaciones del árbol, con los ajustes correspondientes a dichas diferencias, pueden restablecer el equilibrio. El hijo intermedio del nodo es aquel cuya clave se encuentra entre las claves del nodo y su padre. Si la diferencia de rango entre ese hijo y el nodo es 2, se rota el árbol para subir el nodo y bajar el padre, y luego se degrada al padre (reduciendo su rango mediante el ajuste de las diferencias de rango a su alrededor), restableciéndose así el equilibrio. En caso contrario, se rota el árbol para subir el hijo y bajar el nodo, y luego se vuelve a rotar para subir el hijo y bajar el padre. Se promueve al hijo, se degradan el nodo y el padre, y se restablece el equilibrio.

Así, en resumen, el procedimiento de inserción consiste en una búsqueda, la creación de un número constante de nodos nuevos, un número logarítmico de cambios de rango y un número constante de rotaciones del árbol. [ 1 ] [ 2 ]

Supresión

Para eliminar un nodo interno de un árbol WAVL, se procede a la eliminación mediante búsqueda binaria . Para un nodo interno sin hijos externos, esto implica encontrar su sucesor en el árbol, intercambiarlo con su sucesor y, finalmente, eliminarlo de su nueva posición, donde su hijo izquierdo es necesariamente un nodo externo. Para eliminar un nodo interno con un hijo externo, se reemplaza el nodo con el otro hijo.

El reequilibrio ascendente comienza considerando la diferencia de rango entre un nodo (inicialmente, el nodo que reemplazó al nodo eliminado) y su padre. Si no hay padre, se restablece el equilibrio. Antes de que comenzara la eliminación, la diferencia de rango entre el padre y el nodo era de 1 o 2, pero esa diferencia ha aumentado en 1 porque el subárbol con raíz en el nodo se ha acortado. Si el padre ahora tiene dos hijos externos, se viola la propiedad de nodo interno porque el padre tiene rango 2. El padre debe ser degradado y el reequilibrio continúa con el padre como el nodo que es la raíz del subárbol demasiado corto.

Si el nodo no tiene padre, se restablece el equilibrio. Si la diferencia de rango entre el nodo y el padre ha aumentado de 1 a 2, se restablece el equilibrio. De lo contrario, si el hermano, el otro hijo del padre, tiene una diferencia de rango de 2 con el padre, se degrada al padre (disminuyendo su rango al disminuir las diferencias de rango entre él y cada uno de sus hijos) y se continúa reequilibrando con el antiguo padre como nuevo nodo. De lo contrario, si los dos hijos del hermano tienen diferencias de rango de 2 con el hermano, se degradan el padre y el hermano y se continúa reequilibrando con el antiguo padre como nuevo nodo.

Finalmente, con diferencias de rango de 3 y 1 para el nodo y el hermano, y con el hermano teniendo un hijo con diferencia de rango 1, una o dos rotaciones del árbol, con los ajustes asociados a las diferencias de rango, pueden restaurar el equilibrio. Identifique a los hijos del hermano como la sobrina y el sobrino, donde la clave de la sobrina se encuentra entre las claves del padre y el hermano, y la clave del sobrino no. Si la diferencia de rango entre el hermano y el sobrino es 1, rote para mover al hermano hacia arriba y al padre hacia abajo, promueva al hermano y degrade al padre una vez, como mínimo, y dos veces, si es necesario para evitar violar la propiedad de nodo interno. De lo contrario, con la diferencia de rango entre el hermano y el sobrino como 1, rote para mover a la sobrina hacia arriba y al hermano hacia abajo, rote de nuevo para mover a la sobrina hacia arriba y al padre hacia abajo, promueva a la sobrina dos veces, degrade al hermano una vez y degrade al padre dos veces.

En general, una eliminación consiste en una búsqueda hacia abajo para encontrar un nodo con un hijo externo, la eliminación de un número constante de nodos nuevos, un número logarítmico de cambios de rango y un número constante de rotaciones del árbol.[1][2]

Vale la pena comparar el resultado de una eliminación que provocaría rotaciones en múltiples niveles en un árbol AVL con los cambios de rotación y rango realizados en un árbol WAVL. En la segunda imagen, se eliminó el nodo con valor 12, seguido de una rotación a la derecha y la asignación de rango cero a todos los nodos externos.

Árbol de Fibonacci con rangos
Árbol de Fibonacci con rangos después de la eliminación

Complejidad computacional

Cada búsqueda, inserción o eliminación en un árbol WAVL implica seguir un único camino en el árbol y realizar un número constante de pasos para cada nodo en el camino. En un árbol WAVL con n elementos que solo ha sufrido inserciones, la longitud máxima del camino esregistroφnorte1.44registro2norte{\displaystyle \log _{\varphi }n\approx 1.44\log _{2}n}. Si se han producido tanto inserciones como eliminaciones, la longitud máxima de la ruta es2registro2norte{\displaystyle 2\log _{2}n}Por lo tanto, en cualquier caso, el tiempo en el peor de los casos para cada búsqueda, inserción o eliminación en un árbol WAVL con n elementos de datos es O (log n ) .

Además, tras encontrar un nodo para insertar o eliminar, la complejidad amortizada de las operaciones de reestructuración del árbol es constante. Agregar o eliminar el nodo en sí requiere tiempo constante, la cantidad de rotaciones es siempre, como máximo, constante y se puede demostrar que la cantidad total de cambios de rango en los nodos es lineal con respecto al número de inserciones y eliminaciones.

Los árboles WAVL están estrechamente relacionados con los árboles AVL y los árboles rojo-negro . A cada árbol AVL se le pueden asignar rangos a sus nodos de forma que se convierta en un árbol WAVL. Asimismo, a cada árbol WAVL se le pueden colorear los nodos de rojo y negro (y reasignar sus rangos) de forma que se convierta en un árbol rojo-negro. Sin embargo, algunos árboles WAVL no se derivan de árboles AVL de esta manera, y algunos árboles rojo-negro no se derivan de árboles WAVL de esta manera.

Árboles AVL

Un árbol AVL es un tipo de árbol de búsqueda binaria balanceado en el que las alturas de los dos hijos de cada nodo interno deben diferir como máximo en uno. [ 7 ] La altura de un nodo externo es cero, y la altura de cualquier nodo interno es siempre uno más el máximo de las alturas de sus dos hijos. Por lo tanto, la función de altura de un árbol AVL obedece las restricciones de un árbol WAVL, y podemos convertir cualquier árbol AVL en un árbol WAVL utilizando la altura de cada nodo como su rango. [ 1 ] [ 2 ]

La diferencia clave entre un árbol AVL y un árbol WAVL surge cuando un nodo tiene dos hijos con el mismo rango o altura. En un árbol AVL, si un nodo x tiene dos hijos con la misma altura h , entonces la altura de x debe ser exactamente h + 1. En cambio, en un árbol WAVL, si un nodo x tiene dos hijos con el mismo rango r , entonces el rango de x puede ser r + 1 o r + 2. Esto se debe a que el rango no es estrictamente igual a la altura en un árbol WAVL. Esta mayor flexibilidad en los rangos también conlleva una mayor flexibilidad en las estructuras: algunos árboles WAVL no se pueden convertir en árboles AVL ni siquiera modificando sus rangos, porque incluyen nodos cuyas alturas de hijos difieren en más de uno. [ 2 ] Sin embargo, podemos decir que todos los árboles AVL son árboles WAVL. Los árboles AVL son árboles WAVL sin el tipo de nodo que tiene ambos hijos con una diferencia de rango de 2. [ 1 ]

Si un árbol WAVL se crea solo mediante operaciones de inserción, su estructura será la misma que la de un árbol AVL creado con la misma secuencia de inserción, y sus rangos serán los mismos que los del árbol AVL correspondiente. Solo mediante operaciones de eliminación un árbol WAVL puede diferenciarse de un árbol AVL. En particular, esto implica que un árbol WAVL creado solo mediante inserciones tiene una altura máxima de .registroφnorte1.44registro2norte{\displaystyle \log _{\varphi }n\approx 1.44\log _{2}n}. [ 2 ]

árboles rojos y negros

Un árbol rojo-negro es un árbol de búsqueda binaria equilibrado en el que cada nodo tiene un color (rojo o negro) que satisface las siguientes propiedades:

  • Los nodos externos son negros.
  • Si un nodo interno es rojo, sus dos hijos son negros.
  • Todos los caminos desde la raíz hasta un nodo externo tienen el mismo número de nodos negros.

Los árboles rojo-negro pueden definirse de forma equivalente en términos de un sistema de rangos, almacenado en los nodos, que satisface los siguientes requisitos (diferentes de los requisitos para los rangos en los árboles WAVL):

  • El rango de un nodo externo siempre es  0 y el rango de su padre siempre es  1.
  • El rango de cualquier nodo que no sea la raíz es igual al rango de su padre o al rango de su padre menos  1.
  • No hay dos aristas consecutivas en ningún camino raíz-hoja que tengan una diferencia de rango  de 0.

La equivalencia entre las definiciones basadas en color y en rango se puede observar, en un sentido, coloreando un nodo de negro si su padre tiene un rango mayor y de rojo si su padre tiene el mismo rango. En el otro sentido, los colores se pueden convertir en rangos haciendo que el rango de un nodo negro sea igual al número de nodos negros en cualquier ruta hacia un nodo externo, y haciendo que el rango de un nodo rojo sea igual al de su padre. [ 8 ]

Los rangos de los nodos en un árbol WAVL se pueden convertir a un sistema de rangos de nodos, que cumpla con los requisitos para los árboles rojo-negro, dividiendo cada rango por dos y redondeando al entero más cercano. [ 9 ] Debido a esta conversión, para cada árbol WAVL existe un árbol rojo-negro válido con la misma estructura. Debido a que los árboles rojo-negro tienen una altura máxima2registro2norte{\displaystyle 2\log _{2}n}, lo mismo es cierto para los árboles WAVL. [ 1 ] [ 2 ] Sin embargo, existen árboles rojo-negro a los que no se les puede asignar una función de rango de árbol WAVL válida. [ 2 ]

A pesar de que, en términos de su estructura arbórea, los árboles WAVL son casos especiales de árboles rojo-negro, sus operaciones de actualización son diferentes. Las rotaciones de árbol utilizadas en las operaciones de actualización de árboles WAVL pueden realizar cambios que no estarían permitidos en un árbol rojo-negro, ya que, en efecto, provocarían el cambio de color de grandes subárboles del árbol rojo-negro en lugar de realizar cambios de color solo en una única ruta del árbol. [ 2 ] Esto permite que los árboles WAVL realicen menos rotaciones de árbol por eliminación, en el peor de los casos, que los árboles rojo-negro. [ 1 ] [ 2 ]

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 Goodrich, Michael T. ; Tamassia, Roberto ( 2015), "4.4 Árboles AVL débiles", Diseño y aplicaciones de algoritmos , Wiley, págs. 130–138 .
  2. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Haeupler, Bernhard; Sen, Siddhartha; Tarjan, Robert E. (2015), "Árboles equilibrados por rango" (PDF) , ACM Transactions on Algorithms , 11 (4): Art. 30, 26, doi : 10.1145/2689412 , MR 3361215 .
  3. ^ Goodrich & Tamassia (2015) , Sección 2.3 Árboles, págs.
  4. Goodrich y Tamassia (2015) , Capítulo 3 Árboles de búsqueda binaria, págs. 89–114.
  5. En esto seguimos a Goodrich y Tamassia (2015) . En la versión descrita por Haeupler, Sen y Tarjan (2015) , los nodos externos tienen rango −1 . Esta variación apenas afecta al funcionamiento de los árboles WAVL, pero sí provoca algunos cambios menores en la fórmula para convertir árboles WAVL en árboles rojo-negro.
  6. 1 2 Goodrich y Tamassia (2015) , Sección 3.1.2 Búsqueda en un árbol de búsqueda binaria, págs. 95–96.
  7. ^ Goodrich & Tamassia (2015) , Sección 4.2 Árboles AVL, págs.
  8. Goodrich y Tamassia (2015) , Sección 4.3 Árboles rojo-negros, págs. 126-129.
  9. En Haeupler, Sen y Tarjan (2015) , la conversión se realiza redondeando hacia abajo, porque los rangos de los nodos externos son −1 en lugar de 0. Goodrich y Tamassia (2015) dan una fórmula que también redondea hacia abajo, pero debido a que usan el rango 0 para los nodos externos, su fórmula asigna incorrectamente el rango rojo-negro 0 a los nodos internos con rango WAVL 1.