2010-11-27 11 views

Respuesta

19

Creo que tienes razón. No se puede compartir el lomo de la lista porque todas las colas son diferentes. Por lo tanto, la lista de prefijos, si se evaluara por completo, tomaría el espacio completo de(n), que debe tomar Ω (n) para generar.

Tenga en cuenta que (la versión más lenta) de la función que escribió está disponible en Data.List como inits.

Sin embargo, hay una buena optimización que puedes hacer. Esta ecuación es válida:

map (foldl f z) . inits = scanl f z 

Y scanl se ejecuta en tiempo lineal. Entonces, si puede expresar lo que desea hacer con cada prefijo como un doblez a la izquierda, entonces puede evitar la complejidad cuadrática de compilar la lista de prefijos.

+2

+1 buena idea con scanl –

3

¿No es dependiente de la representación? Si representa listas como almacenamiento contiguo más índice de inicio y final (similar a cadenas de bytes), puede compartir el almacenamiento y solo necesita recorrer una vez para compilar la lista de índices. El algoritmo no cambiaría, solo la representación. Para este caso de uso en particular, el uso de listas snoc (listas binarias, pero anidadas desde el final, no el inicio, de la lista) también permitiría compartir sublistas, ¿verdad?

+0

Creo que es relativamente claro, que su pregunta se dirige a una lista de haskell ordinaria '[]'. -1 – fuz

+2

Eso depende de si está mirando la sintaxis del ejemplo o la pregunta tal como se establece. Dada la respuesta aceptada, la limitación a las listas binarias puede haber sido intencionada. Pero eso no es una propiedad de algoritmos puramente funcionales, ni siquiera de tales algoritmos en Haskell, solo de esta representación de lista particular. – claus

+0

Sí, se pretendía la limitación a las listas binarias. Podría haberlo aclarado. –

Cuestiones relacionadas