Sono nuovo di Haskell e sto cercando di implementare alcuni algoritmi noti al suo interno.Unisci ordina in Haskell
Ho implementato il merge sort su stringhe. Sono un po 'deluso dalle prestazioni della mia implementazione Haskell rispetto alle implementazioni C e Java. Sulla mia macchina (Ubuntu Linux, 1,8 GHz), C (gcc 4.3.3) ordina 1 000 000 stringhe in 1,85 s, Java (Java SE 1.6.0_14) in 3.68 s, Haskell (GHC 6.8.2) in 25.89 S. Con un input più grande (10.000.000 di stringhe), C ha 21.81 s, Java richiede 59.68 s, Haskell inizia lo scambio e ho preferito interrompere il programma dopo alcuni minuti.
Poiché sono nuovo di Haskell, sarei interessato a sapere se la mia implementazione può rendere più efficiente in termini di tempo/spazio.
Grazie in anticipo per qualsiasi suggerimento Giorgio
mia realizzazione:
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, quali flag di compilazione hai usato con GHC? – yairchu
Questa non è esattamente una implementazione ideale. Stai continuamente attraversando ogni sottolista per trovare la sua lunghezza, e questo è solo inutile. Vedi la versione Hynek -Pichi- Vychodil sotto per la versione più pigra e probabilmente più veloce. – Axman6
@ Axman6 - È possibile fornire un collegamento a questo algoritmo? O una citazione? – rtperson