Según Pippenger [1996] , al comparar un sistema Lisp que es puramente funcional (y tiene una semántica de evaluación estricta, no perezosa) con uno que puede mutar datos, se puede traducir un algoritmo escrito para el Lisp impuro que se ejecuta en O ( n ) a un algoritmo en el Lisp puro que se ejecuta en tiempo O ( n log n ) (basado en el trabajo de Ben-Amram y Galil [1992] sobre la simulación de memoria de acceso aleatorio utilizando solo punteros). Pippenger también establece que hay algoritmos para los que es lo mejor que puede hacer; hay problemas que son O ( n ) en el sistema impuro que son Ω ( n log n ) en el sistema puro.
Hay algunas advertencias sobre este documento. Lo más significativo es que no aborda los lenguajes funcionales perezosos, como Haskell. Bird, Jones y De Moor [1997] demuestran que el problema construido por Pippenger se puede resolver en un lenguaje funcional vago en O ( n ) tiempo, pero no establecen (y que yo sepa, nadie tiene) si No un lenguaje funcional perezoso puede resolver todos los problemas en el mismo tiempo de ejecución asintótico que un lenguaje con mutación.
El problema construido por Pippenger requiere que Ω ( n log n ) esté específicamente construido para lograr este resultado, y no es necesariamente representativo de problemas prácticos del mundo real. Existen algunas restricciones sobre el problema que son un poco inesperadas, pero necesarias para que la prueba funcione; en particular, el problema requiere que los resultados se calculen en línea, sin poder acceder a entradas futuras, y que la entrada consista en una secuencia de átomos de un conjunto ilimitado de átomos posibles, en lugar de un conjunto de tamaño fijo. Y el documento solo establece resultados (límite inferior) para un algoritmo impuro de tiempo de ejecución lineal; para problemas que requieren un mayor tiempo de ejecución, es posible que el O adicional (log n) factor visto en el problema lineal puede ser "absorbido" en el proceso de operaciones adicionales necesarias para algoritmos con tiempos de ejecución mayores. Estas aclaraciones y preguntas abiertas son exploradas brevemente por Ben-Amram [1996] .
En la práctica, se pueden implementar muchos algoritmos en un lenguaje funcional puro con la misma eficiencia que en un lenguaje con estructuras de datos mutables. Para obtener una buena referencia sobre las técnicas que se utilizarán para implementar estructuras de datos puramente funcionales de manera eficiente, consulte "Estructuras de datos puramente funcionales" de Chris Okasaki [Okasaki 1998] (que es una versión ampliada de su tesis [Okasaki 1996] ).
Cualquiera que necesite implementar algoritmos en estructuras de datos puramente funcionales debería leer Okasaki. Siempre puede obtener, en el peor de los casos, una desaceleración de O (log n ) por operación simulando memoria mutable con un árbol binario equilibrado, pero en muchos casos puede hacerlo considerablemente mejor que eso, y Okasaki describe muchas técnicas útiles, desde técnicas amortizadas hasta técnicas reales. tiempo que hacen el trabajo amortizado de forma incremental. Las estructuras de datos puramente funcionales pueden ser un poco difíciles de trabajar y analizar, pero proporcionan muchos beneficios, como la transparencia referencial, que son útiles en la optimización del compilador, en la computación paralela y distribuida, y en la implementación de características como el control de versiones, deshacer y deshacer.
Tenga en cuenta también que todo esto solo analiza los tiempos de ejecución asintóticos. Muchas técnicas para implementar estructuras de datos puramente funcionales le brindan una cierta cantidad de desaceleración constante del factor, debido a la contabilidad adicional necesaria para que funcionen, y detalles de implementación del idioma en cuestión. Los beneficios de las estructuras de datos puramente funcionales pueden ser mayores que estas desaceleraciones constantes de los factores, por lo que generalmente necesitará hacer compensaciones en función del problema en cuestión.
Referencias
- Ben-Amram, Amir y Galil, Zvi 1992. "Sobre punteros versus direcciones" Journal of the ACM, 39 (3), pp. 617-648, julio de 1992
- Ben-Amram, Amir 1996. "Notas sobre la comparación de Pippenger de Lisp puro e impuro" Manuscrito no publicado, DIKU, Universidad de Copenhague, Dinamarca
- Bird, Richard, Jones, Geraint y De Moor, Oege 1997. "Más prisa, menos velocidad: evaluación perezosa versus ansiosa" Journal of Functional Programming 7, 5 págs. 541–547, septiembre de 1997
- Okasaki, Chris 1996. Tesis doctoral "Estructuras de datos puramente funcionales" , Universidad Carnegie Mellon
- Okasaki, Chris 1998. "Estructuras de datos puramente funcionales" Cambridge University Press, Cambridge, Reino Unido
- Pippenger, Nicholas 1996. Simposio ACM "Pure Versus Impure Lisp" sobre Principios de Lenguajes de Programación, páginas 104-109, enero 1996