Esiste qualche funzione nelle librerie haskell che ordina gli interi in tempo O (n) ?? [Con, O (n) intendo più veloce di ordinamento per confronti e specifico per gli interi]ordinamento numeri interi veloci in haskell
Fondamentalmente trovo che il seguente codice prende un sacco di tempo con il tipo (rispetto alla somma lista senza l'ordinamento):
import System.Random
import Control.DeepSeq
import Data.List (sort)
genlist gen = id $!! sort $!! take (2^22) ((randoms gen)::[Int])
main = do
gen <- newStdGen
putStrLn $ show $ sum $ genlist gen
Sommare un elenco non richiede deepseq ma quello che sto cercando di fare, ma il codice sopra è abbastanza buono per i puntatori che sto cercando.
Tempo: 6 secondi (senza ordinamento); circa 35 secondi (con ordinamento)
Memoria: circa 80 MB (senza ordinamento); circa 310 MB (con ordinamento)
Nota 1:! memoria è un problema più grande di tempo per me qui come per il compito a portata di mano io sono sempre fuori gli errori di memoria (l'uso della memoria diventa 3GB dopo 30 minuti di corsa -time)
Suppongo che gli algoritmi più veloci forniranno anche la stampa della memoria di bettore, quindi cerchiamo il tempo O (n).
Nota 2: Sto cercando algoritmi veloci per Int64, sebbene siano utili anche algoritmi veloci per altri tipi specifici.
soluzione utilizzata: IntroSort con vettori disimballati era abbastanza buono per il mio compito:
import qualified Data.Vector.Unboxed as V
import qualified Data.Vector.Algorithms.Intro as I
sort :: [Int] -> [Int]
sort = V.toList . V.modify I.sort . V.fromList
'O (n)' ordinamento? Immagino che potresti provare a implementare [spaghetti sort] (https://en.wikipedia.org/wiki/Spaghetti_sort). – huon
Un ordinamento di confronto non può avere una complessità minore di 'O (n * log n)'. Poiché l'intervallo è limitato, è possibile utilizzare un ordinamento per bucket (ma ciò non ridurrebbe l'utilizzo della memoria qui;). Hai provato a costruire un 'Data.IntSet' e' toList' su questo? –
utilizzando Data.IntSet ci vogliono circa 24 secondi, quindi sembra più veloce ma il footprint di memoria è 320 MB !! ['genlist gen = id $ !! per visualizzare $ !! ((fromList $ !! take (2^22) ((randoms gen) :: [Int])) :: IntSet) '] – Karan