Есть ли какая-либо функция в библиотеках haskell, которая сортирует целые числа в O (n) времени? [К, О (п) я имею в виду быстрее, чем сравнение сортировка и специфическая для целых]сортировка целых чисел в haskell
В принципе я считаю, что следующий код занимает много времени с родом (по сравнению с суммированием списка без сортировки):
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
Подведение итогов для списка не требует глубины, но то, что я пытаюсь сделать, но приведенный выше код достаточно хорош для указателей, которые я ищу.
Время: 6 секунд (без сортировки); около 35 секунд (с сортировкой)
Память: около 80 МБ (без сортировки); около 310 МБ (с сортировкой)
Примечание 1: Память - большая проблема, чем время для меня здесь, так как для задачи под рукой я получаю ошибки в памяти (использование памяти становится 3 ГБ! после 30 минут работы -time)
Я предполагаю, что более быстрые алгоритмы также обеспечат печать на бета-памяти, следовательно, ищите O (n) время.
Примечание 2: Я ищу быстрые алгоритмы для Int64, хотя быстрые алгоритмы для других конкретных типов также будут полезны.
Решение Используется: IntroSort с Unboxed векторами был достаточно хорош для моей задачи:
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)' сортировка? Я думаю, вы могли бы попробовать реализовать [сортировку спагетти] (https://en.wikipedia.org/wiki/Spaghetti_sort). – huon
Сортировка сравнения не может иметь меньшую сложность, чем 'O (n * log n)'. Поскольку диапазон конечен, вы можете использовать сортировку ведра (но это не уменьшит использование памяти здесь;). Вы пытались создать 'Data.IntSet' и' toList'? –
с использованием Data.IntSet занимает около 24 секунд, поэтому он выглядит быстрее, но объем памяти составляет 320 МБ! ['genlist gen = id $ !! toList $ !! ((fromList $ !! take (2^22) ((randoms gen) :: [Int])) :: IntSet) '] – Karan