Ordenación por frecuencia
Definir la función
1 |
ordPorFrecuencia :: Ord a => [a] -> [a] |
tal que (ordPorFrecuencia xs) es la lista obtenidas ordenando los elementos de xs por su frecuencia, de los que aparecen más a los que aparecen menos, y los que aparecen el mismo número de veces se ordenan de manera creciente según su valor. Por ejemplo,
1 2 3 |
ordPorFrecuencia "canalDePanama" == "aaaaannmlecPD" ordPorFrecuencia "11012018" == "11110082" ordPorFrecuencia [2,3,5,3,7,9,5,3,7] == [3,3,3,7,7,5,5,9,2] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import Test.QuickCheck import Data.List (group, sort, sortBy) import Data.Function (on) -- 1ª solución -- =========== ordPorFrecuencia1 :: Ord a => [a] -> [a] ordPorFrecuencia1 xs = concatMap snd (reverse (sort [(length xs,xs) | xs <- group (sort xs)])) -- 2ª solución -- =========== ordPorFrecuencia2 :: Ord a => [a] -> [a] ordPorFrecuencia2 = concat . reverse . sortBy comparaPorLongitud . group . sort comparaPorLongitud :: [a] -> [a] -> Ordering comparaPorLongitud xs ys = compare (length xs) (length ys) -- 3ª solución -- =========== ordPorFrecuencia3 :: Ord a => [a] -> [a] ordPorFrecuencia3 = concat . reverse . sortBy (compare `on` length). group . sort -- Comparación de eficiencia -- ========================= -- λ> xs = show (2^2000000) -- λ> last (ordPorFrecuencia1 xs) -- '8' -- (1.45 secs, 938,345,320 bytes) -- λ> last (ordPorFrecuencia2 xs) -- '8' -- (1.33 secs, 900,239,200 bytes) -- λ> last (ordPorFrecuencia3 xs) -- '8' -- (1.30 secs, 900,241,848 bytes) |
8 Comentarios