avevo bisogno di una funzione finestra efficiente scorrevole in Haskell, così ho scritto il seguente:Implementazione di un algoritmo efficiente finestra scorrevole in Haskell
windows n [email protected](x:xs)
| length v < n = []
| otherwise = v : windows n xs
where
v = take n xz
Il mio problema con questo è che penso che la complessità è O (n * m) dove m è la lunghezza della lista e n è la dimensione della finestra. Un conto alla rovescia dell'elenco una volta per take
, un'altra volta per length
, e lo si fa in basso nell'elenco delle volte essenzialmente di m-n. Sembra che possa essere più efficiente di questo, ma non riesco a renderlo più lineare. Qualche acquirente?
o 'foldr (zipWith (:)) (ripeti []). prendi m. tails'. –
@Will Ness - oh che bello – user1441998
@ user1441998 è proprio quello che sta facendo 'sequenceA' su' ZipList's. :) (per "o" intendevo "o può essere scritto esplicitamente come ..."). ['sequenceA'] (http://hackage.haskell.org/package/base-4.8.1.0/docs/src/Data.Traversable.html#sequenceA) == [' foldr ((<*>). ((:) <$>)) (pure []) '] (http://hackage.haskell.org/package/base-4.8.1.0/docs/src/Data.Traversable.html#line-177). –