Además de los puntos de Macneils ...
Los árboles rojo-negro son quizás más directamente útiles porque existen operaciones eficientes útiles que no son ampliamente compatibles en implementaciones de bibliotecas estándar como C ++ std::map
(al menos AFAIK). Los árboles rojo-negro pueden admitir "dividir" (cortar un árbol en dos, uno que contiene claves menos que una clave específica y otro que contiene claves mayores) y "unir" (al revés, que combina un árbol de teclas grandes con un árbol pequeño) Las teclas) se pueden hacer en O (log n), pero si son compatibles con las bibliotecas de contenedor estándar, parece ser una cosa bien oculta.
Sin embargo, "aumentar" las estructuras de datos es común. Un ejemplo simple es agregar información de tamaño de subárbol a los nodos en casi cualquier estructura de datos de árbol para admitir los subíndices O (log n). Los ejemplos más sofisticados incluyen árboles de intervalo.
Una vez que tenga la idea de aumentar las estructuras de datos, hay muchas variaciones que pueden ser útiles para aplicaciones particulares, y muy pocas están disponibles preempaquetadas como una biblioteca. Las estructuras de datos de la biblioteca estándar existentes (por ejemplo, como std::map
) no pueden aumentarse antes de copiar el código fuente y modificarlo directamente, no puede aumentarlas utilizando parámetros de plantilla.
Por supuesto, para desarrollar una estructura de datos aumentada, debe comprender la estructura de datos no aumentada subyacente.
Los árboles AVL pueden ser más rápidos que los árboles rojo-negro si realiza muchas más búsquedas que inserciones / eliminaciones (y siempre que no necesite esas operaciones de división / combinación), por lo tanto, dependiendo de la aplicación, pueden ser muy Buena base para aumentar.