Versión eficiente de 'inits'
Es decir,inits "abc" == ["","a","ab","abc"]
Hay una versión estándar deinits
enData.List
, pero a continuación he escrito una versión yo mismo:
myInits = f id
where
f start (l:ls) = (start []):(f (start . (l:)) ls)
f start [] = [(start [])]
Si bien mi versión es bastante más simple que la versión estándar, sospecho que no es tan buena por razones de eficiencia. Sospecho que cuandomyInits l
se evalúa completamente se necesitaO(n^2)
espacio. Tomar como ejemplo,myTails
, una implementación details
:
myTails a@(_:ls) = a:(myTails ls)
myTails [] = [[]]
Que es casi exactamente lo mismo que la versión estándar y sospecho que lograO(n)
espacio reutilizando las colas de las listas.
Podría alguien explicar:
¿Por qué mi versión deinits
es malo.Por qué otro enfoque es mejor (ya sea el estándar enData.List
o el tuyo).