En las aplicaciones del mundo real, ¿hay un beneficio concreto al usar los algoritmos lugar de ?
Este es el caso cuando uno usa, por ejemplo, árboles de Van Emde Boas en lugar de implementaciones de árbol de búsqueda binaria más convencionales. Pero, por ejemplo, si tomamos , en el mejor de los casos, el algoritmo logarítmico doble supera al logarítmico en (aproximadamente) un factor de . Y también, en general, la implementación es más complicada y compleja.
Dado que personalmente prefiero BST a los árboles VEB, ¿qué te parece?
Se podría demostrar fácilmente que:
algorithms
complexity-theory
binary-trees
algorithm-analysis
search-trees
Ghassen Hamrouni
fuente
fuente
Respuestas:
¡No olvide que todavía crece exponencialmente (en ) más rápido que !log ( n ) log ( log n )logn log(n) log(logn)
De hecho, si observa el cociente de y , no hay mucho que ver:log ( log ( n ) )log(n) log(log(n))
[ fuente ]
Pero aún así, obtienes un factor de cinco a seis para tamaños de hasta . Tenga en cuenta que los tamaños más grandes no son infrecuentes en la práctica, ¡y una aceleración por ese factor es increíble ! Puede hacer la diferencia entre tener resultados después del almuerzo o solo mañana. Tenga en cuenta que parte de la aceleración puede ser carcomida por constantes más altas de la implementación del árbol; tendría que trazar (o analizar) y con las constantes de tiempo de ejecución reales para obtener una imagen real.c ⋅ log ( n ) d ⋅ log ( log ( n ) ) c , d100000 c⋅log(n) d⋅log(log(n)) c,d
Además, lo que Dave menciona es importante: si la operación acelerada de esta manera se ejecuta, por ejemplo, linealmente a menudo, las aceleraciones constantes se convierten en aceleraciones lineales, es decir, ¡puede disminuir la constante inicial de todo su algoritmo! Como dije anteriormente, eso es increíble. Solo mira lo que sucede si ejecutas la operación veces:n
[ fuente ]
Ahora, si eso no vale la pena, no sé qué.
fuente
Uno podría imaginar que la diferencia en la complejidad realmente no importa tanto, y que el tiempo de ejecución real es más importante. Pero si el algoritmo está en el núcleo de otro algoritmo, entonces esta diferencia puede ser importante.
Desde un propósito puramente teórico, la diferencia, por supuesto, es importante, especialmente si el algoritmo es parte de otro. Puede colocar el algoritmo más grande en una clase de complejidad diferente.
fuente
De hecho, he comparado el árbol de van Emde-Boas una vez. Lo comparé con un árbol AA, un hashmap y una matriz de bits.
Las pruebas realizan
size
inserciones con números aleatorios en el intervalo[0, bound]
, luegosize
buscan, luegosize
eliminan y luego vuelven asize
buscar. Las eliminaciones también se realizan en números aleatorios, por lo que primero debe averiguar si están en la estructura.Aquí están los resultados (
size
= 2000000,bound
= 10000000) en segundos:Como puede ver, los árboles de van Emde-Boas son aproximadamente dos veces más lentos que los mapas hash, diez veces más lentos que las matrices de bits y 5 veces más rápidos que los árboles de búsqueda binarios.
Por supuesto, lo anterior necesita un descargo de responsabilidad: las pruebas son artificiales, posiblemente puede mejorar el código o usar un lenguaje diferente con un compilador cuya salida es más rápida, y así sucesivamente.
Este descargo de responsabilidad es la razón principal por la que usamos el análisis asintótico en el diseño de algoritmos: como no tiene idea de cuáles son las constantes y las constantes pueden cambiar según los factores ambientales, lo mejor que podemos hacer es un análisis asintótico.
Ahora, en el caso de versus : en el ejemplo anterior, mi árbol van Emde-Boas puede contener elementos. y , que es una mejora del factor 6, que es bastante en la práctica. Además, los árboles van Emde-Boas tienen buenos factores constantes (se trata de factores constantes en la práctica para diferencias tan pequeñas) ya que no necesitan equilibrarse.log log nlogn loglogn log 2 32 = 32 log 32 = 5232 log232=32 log32=5
fuente