Je suis nouveau à Haskell et j'essaye d'implémenter quelques algorithmes connus dedans.Fusionner trier dans Haskell
J'ai implémenté le tri par fusion sur les chaînes. Je suis un peu déçu des performances de mon implémentation Haskell par rapport aux implémentations C et Java. Sur ma machine (Ubuntu Linux, 1,8 GHz), C (gcc 4.3.3) trie 1 000 000 chaînes en 1,85 s, Java (Java SE 1.6.0_14) en 3,68 s, Haskell (GHC 6.8.2) en 25,89 s. Avec une plus grande entrée (10 000 000 chaînes), C prend 21,81 s, Java prend 59,68 s, Haskell commence à échanger et j'ai préféré arrêter le programme après plusieurs minutes.
Depuis que je suis nouveau à Haskell, je serais intéressé de savoir si ma mise en œuvre peut être rendue plus de temps/espace efficace.
Merci à l'avance pour tout soupçon Giorgio
Ma mise en œuvre:
merge :: [String] -> [String] -> [String]
merge [] ys = ys
merge xs [] = xs
merge (x:xs) (y:ys) = if x < y
then x : (merge xs (y:ys))
else y : (merge (x:xs) ys)
mergeSort :: [String] -> [String]
mergeSort xs = if (l < 2)
then xs
else merge h t
where l = length xs
n = l `div` 2
s = splitAt n xs
h = mergeSort (fst s)
t = mergeSort (snd s)
btw, quels drapeaux de compilation avez-vous utilisé avec GHC? – yairchu
Ce n'est pas exactement une implémentation idéale. Vous parcourez continuellement chaque sous-liste pour trouver sa longueur, ce qui n'est pas nécessaire. Voir la version de Hynek -Pichi- Vychodil ci-dessous pour la version la plus paresseuse et probablement plus rapide. – Axman6
@ Axman6 - Pouvez-vous fournir un lien vers cet algorithme? Ou une citation? – rtperson