Gibt es eine Funktion in Haskell-Bibliotheken, die ganze Zahlen in O (n) Zeit sortiert? [Von, O (n) ich meine, schneller als Vergleich zu sortieren und zu spezifisch für ganze Zahlen]Sortierung Ganzzahlen schnell in Haskell
Grundsätzlich finde ich, dass der folgende Code eine Menge Zeit mit der Art nimmt (im Vergleich zu der Liste Summieren ohne Sortierung):
Summieren einer Liste erfordert nicht deepseq, aber was ich versuche, tut, aber der obige Code ist gut genug für die Zeiger, die ich suche.
Zeit: 6 Sekunden (ohne Sortierung); ca. 35 Sekunden (mit Sortierung)
Speicher: ca. 80 MB (ohne Sortierung); ca. 310 MB (mit Sortierung)
Hinweis 1: Speicher ist ein größeres Problem als Zeit für mich hier für die Aufgabe Ich bekomme aus dem Speicherfehler (Speicherverbrauch wird 3GB! nach 30 Minuten Lauf (Zeit)
Ich gehe davon aus, dass schnellere Algorithmen auch einen besseren Speicherdruck liefern und daher nach O (n) Zeit suchen.
Hinweis 2: Ich suche nach schnellen Algorithmen für Int64, obwohl schnelle Algorithmen für andere spezifische Typen auch hilfreich sein werden.
verwendete Lösung: Introsort mit unboxed Vektoren war gut genug für meine Aufgabe:
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)' Sortieren? Ich denke, Sie könnten versuchen, [Spaghetti sort] (https://en.wikipedia.org/wiki/Spaghetti_sort) zu implementieren. – huon
Eine Vergleichssortierung darf nicht weniger komplex sein als 'O (n * log n)'. Da der Bereich endlich ist, könnten Sie eine Bucket-Sortierung verwenden (aber das würde die Speicherbelegung hier nicht reduzieren;). Haben Sie versucht, ein 'Data.IntSet' und' ToList' zu erstellen? –
mit Data.IntSet dauert es etwa 24 Sekunden, so scheint es schneller, aber der Speicherbedarf ist 320 MB !! ['genlist gen = id $ !! ZuListe $ !! (fromList $ !! take (2^22) ((randoms gen) :: [Int])) :: IntSet) '] – Karan