Un segmento de una lista xs es una sublista de xs formada por elementos consecutivos en la lista. El problema de la máxima suma de segmentos consiste en dada una lista de números enteros calcular el máximo de las sumas de todos los segmentos de la lista. Por ejemplo, para la lista [-1,2,-3,5,-2,1,3,-2,-2,-3,6] la máxima suma de segmentos es 7 que es la suma del segmento [5,-2,1,3] y para la lista [-1,-2,-3] es 0 que es la suma de la lista vacía.
Definir la función
mss :: [Integer] -> Integer |
tal que (mss xs) es la máxima suma de los segmentos de xs. Por ejemplo,
mss [-1,2,-3,5,-2,1,3,-2,-2,-3,6] == 7 mss [-1,-2,-3] == 0 mss [1..500] == 125250 mss [1..1000] == 500500 mss [-500..3] == 6 mss [-1000..3] == 6 |
Soluciones
import Data.List (inits,tails) -- 1ª solución mss :: [Integer] -> Integer mss = maximum . map sum . segmentos -- (segmentos xs) es la lista de los segmentos de xs. Por ejemplo, -- ghci> segmentos "abc" -- ["","a","ab","abc","","b","bc","","c",""] segmentos :: [a] -> [[a]] segmentos = concat . map inits . tails -- 2ª definición: mss2 :: [Integer] -> Integer mss2 = maximum . map (maximum . scanl (+) 0) . tails -- 3ª definición: mss3 :: [Integer] -> Integer mss3 = maximum . map sum . concatMap tails . inits -- 4ª definición mss4 :: [Integer] -> Integer mss4 = fst . foldr (\x (b,a) -> (max (a+x) b, max 0 (a+x))) (0,0) -- 5ª definición (con scanl): mss5 :: [Integer] -> Integer mss5 = maximum . scanl (\a x -> max 0 a + x) 0 -- Comparación de eficiencia -- ========================= -- ghci> mss [1..500] -- 125250 -- (7.52 secs, 2022130824 bytes) -- -- ghci> mss2 [1..500] -- 125250 -- (0.01 secs, 10474956 bytes) -- -- ghci> mss3 [1..500] -- 125250 -- (0.98 secs, 841862016 bytes) -- -- ghci> mss4 [1..500] -- 125250 -- (0.01 secs, 552252 bytes) -- -- ghci> mss2 [1..1000] -- 500500 -- (0.06 secs, 54575712 bytes) -- -- ghci> mss3 [1..1000] -- 500500 -- (7.87 secs, 7061347900 bytes) -- -- ghci> mss4 [1..1000] -- 500500 -- (0.01 secs, 549700 bytes) -- -- ghci> mss2 [1..2000] -- 2001000 -- (0.29 secs, 216424336 bytes) -- -- ghci> mss2 [1..5000] -- 12502500 -- (2.37 secs, 1356384840 bytes) -- -- ghci> mss4 [1..5000] -- 12502500 -- (0.02 secs, 1913548 bytes) -- -- ghci> mss5 [1..5000] -- 12502500 -- (0.01 secs, 2886360 bytes) |
Referencias
- El ejercicio está basado en la función mss del libro de Bird Thinking functionally with Haskell (página 127).
- Las soluciones 3ª y 4ª las publicó josejuan aquí
1 Comment