Los árboles AVL y rojo negro se autoequilibran, excepto el rojo y el negro en los nodos. ¿Cuál es la razón principal para elegir árboles negros rojos en lugar de árboles AVL? ¿Cuáles son las aplicaciones de los árboles negros rojos?
108
Respuestas:
Ambos árboles rojo-negro y árboles AVL son los más comúnmente utilizados equilibradas árboles de búsqueda binaria y apoyan la inserción, eliminación y consulta de la garantía
O(logN) time
. Sin embargo, existen los siguientes puntos de comparación entre los dos:O(N)
espacio adicional. Sin embargo, si sabemos que las claves que se insertarán en el árbol siempre serán mayores que cero, podemos usar el bit de signo de las claves para almacenar la información de color de un árbol rojo-negro. Por lo tanto, en tales casos, el árbol rojo-negro no ocupa espacio adicional.Los árboles rojo-negros son de uso más general. Lo hacen relativamente bien en agregar, eliminar y buscar, pero los árboles AVL tienen búsquedas más rápidas a costa de agregar / quitar más lentamente. El árbol rojo-negro se usa en lo siguiente:
java.util.TreeMap
,java.util.TreeSet
fuente
In general, the rotations for an AVL tree are harder to implement and debug than that for a Red-Black tree.
no es verdad.std:: map
y los amigos usan una estructura en particular. Eso queda a la implementación, aunque libstdc ++ y Dinkumware al menos usan árboles rojo-negro, y parece que tiene razón en la práctica.Intenta leer este artículo
Ofrece buenas perspectivas sobre diferencias, similitudes, rendimiento, etc.
Aquí hay una cita del artículo:
Según mi propio entendimiento, los árboles AVL y los árboles RB no están muy lejos en términos de rendimiento. Un árbol RB es simplemente una variante de un árbol B y el equilibrio se implementa de manera diferente a un árbol AVL.
fuente
Nuestra comprensión de las diferencias en el rendimiento ha mejorado a lo largo de los años y ahora la razón principal para usar árboles rojo-negro sobre AVL sería no tener acceso a una buena implementación de AVL, ya que son un poco menos comunes, quizás porque no están cubiertos en CLRS.
Ambos árboles ahora se consideran formas de árboles de rango equilibrado, pero los árboles rojo-negro son consistentemente más lentos en aproximadamente un 20% en las pruebas del mundo real . O incluso un 30-40% más lento cuando se insertan datos secuenciales .
Entonces, las personas que han estudiado árboles rojo-negros pero no árboles AVL tienden a elegir árboles rojo-negro. Los usos principales de los árboles rojo-negro se detallan en la entrada de Wikipedia para ellos .
fuente
Otras respuestas aquí resumen bien los pros y los contras de los árboles RB y AVL, pero encontré esta diferencia particularmente interesante:
Fuente: Mehlhorn y Sanders (2008) (sección 7.4)
Entonces, mientras que los árboles RB y AVL garantizan O (log (N)) en el peor de los casos para la búsqueda, inserción y eliminación, la restauración de la propiedad AVL / RB después de insertar o eliminar un nodo se puede hacer en O (1) tiempo amortizado para árboles rojo-negros.
fuente
A los programadores generalmente no les gusta asignar memoria dinámicamente. El problema con el árbol avl es que para "n" elementos necesitas al menos log2 (log2 (n)) ... (altura-> log2 (n)) bits para almacenar la altura del árbol. Entonces, cuando maneja datos enormes, no puede estar seguro de cuántos bits asignar para almacenar la altura en cada nodo.
Por ejemplo, si usa 4 bytes int (32 bits) para almacenar la altura. La altura máxima puede ser: 2 ^ 32 y, por lo tanto, la cantidad máxima de elementos que puede almacenar en el árbol es 2 ^ (2 ^ 32) - (parece ser muy grande, pero en esta era de datos, supongo que nada es demasiado grande). Y, por lo tanto, si supera este límite, debe asignar dinámicamente más espacio para almacenar la altura.
¡Esta es una respuesta sugerida por un profesor de mi universidad que me pareció razonable! Espero tener sentido.
Ediciones: los árboles AVL están más equilibrados en comparación con los árboles rojos y negros, pero pueden causar más rotaciones durante la inserción y eliminación. Entonces, si su aplicación implica muchas inserciones y eliminaciones frecuentes, entonces se deberían preferir los árboles Red Black. Y si las inserciones y eliminaciones son menos frecuentes y la búsqueda es una operación más frecuente, entonces se debe preferir el árbol AVL sobre el árbol rojo negro. --Fuente GEEKSFORGEEKS.ORG
fuente
you need need atleast log2(log2(n))...(height->log2(n)) bits to store the height of [an AVL] tree
No necesito la altura de ningún nodo en un árbol AVL para implementarlo. Necesitas un poco de información adicional para cada nodo ( YO SOY EL MÁS GRANDE (el hermano con el subárbol más alto)); Es más conveniente y convencional tener dos bits adicionales (el niño es más alto para izquierda y derecha), como lo presentaron AV & L.El reequilibrio del árbol AVL debe cumplir con la siguiente propiedad. (Referencia Wiki - Árbol AVL )
Esto implica que la altura total del árbol AVL no puede volverse loca, es decir, las búsquedas serán mejores con los árboles AVL. Y dado que se deben realizar operaciones adicionales (rotaciones) para no dejar que la altura se vuelva loca, las operaciones de modificación del árbol pueden ser un poco costosas.
fuente