en la escuela nos enseñan cómo podemos equilibrar un árbol AVL luego de una inserción o eliminación.
¿Cómo será realmente útil este tipo de conocimiento en el mundo real? ¿Alguien puede dar un ejemplo de cuándo este tipo de conocimiento sería realmente útil?
Por lo que he visto, en el lugar de trabajo tales detalles casi nunca surgen ...
Puedo ver cómo el conocimiento detallado sobre algoritmos y algunas estructuras de datos puede ser importante, pero no detalles como rotaciones de árbol AVL (y conceptos detallados similares).
¡Gracias!
algorithms
data-structures
rrazd
fuente
fuente
Respuestas:
El estudio de los árboles AVL puede ser útil por las siguientes razones:
Es una buena práctica para razonar sobre datos abstractos. No tiene que pensar en un árbol en particular, debe considerar todas las posibilidades. Practicar con este tipo de razonamiento también puede ayudar con casos más simples.
Es una buena práctica para comprender predicados y contratos. Asegurarse de que un árbol esté equilibrado y que las herramientas que utiliza para demostrar que cada operación conserve el equilibrio se puedan aplicar, por ejemplo, a problemas de seguridad y a código paralelo.
Le permite escribir sus propias variantes o incluso crear tipos de estructuras de datos completamente nuevos.
Es posible que deba implementar un árbol AVL para una nueva biblioteca o plataforma.
Puede debatir los méritos particulares de aprender cada tipo de algoritmo de clasificación o cada tipo de árbol equilibrado. Realmente no importa cuáles termines aprendiendo, pero debes asegurarte de obtener una cobertura completa de los temas más importantes.
Si desea ver cuán importante es conocer los algoritmos en el mundo real, lea " Cómo matar una gran idea ", un artículo en Inc sobre la caída de Friendster, y cómo la más mínima aplicación de principios fundamentales para mejorar la eficiencia podría haberles ayudado.
fuente
Además de los puntos de Macneils ...
Los árboles rojo-negros son quizás más útiles directamente porque existen operaciones útiles y eficientes que no son ampliamente compatibles con implementaciones de bibliotecas estándar como C ++
std::map
(al menos AFAIK). Los árboles rojo-negros pueden soportar "dividir" (cortar un árbol en dos, uno que contenga claves menores que una clave especificada y otro que contenga claves mayores) y "unir" (al revés, combinar un árbol de claves grandes con un árbol de pequeñas teclas) se pueden hacer ambas en tiempo O (log n), pero si se admiten en bibliotecas de contenedores estándar, parece ser algo bien oculto.Sin embargo, "aumentar" las estructuras de datos es común. Un ejemplo simple es agregar información del tamaño del subárbol a los nodos en casi cualquier estructura de datos de árbol para admitir la suscripción de O (log n). Ejemplos más sofisticados incluyen árboles de intervalos.
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 (p. Ej., Por ejemplo
std::map
) no se pueden aumentar 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-negros si realiza muchas más búsquedas que inserciones / eliminaciones (y siempre que no necesite esas operaciones de división / unión), por lo que, según la aplicación, pueden ser una base muy buena para aumentando.
fuente
No
Realmente no es útil en el mundo real ...
Excepto para hacerte pensar .
El mundo real tiene problemas mucho más difíciles , muchos de los cuales aún no tienen soluciones bien conocidas.
fuente