Есть ли в библиотеках Haskell какая-либо функция, которая сортирует целые числа за время O(n)? ? [Под O(n) я подразумеваю более быструю, чем сортировка сравнением и специфичная для целых чисел]
По сути, я обнаружил, что следующий код занимает много времени с сортировкой (по сравнению с суммированием списка без сортировки):
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
Для суммирования списка не требуется deepseq, но то, что я пытаюсь сделать, делает, но приведенный выше код достаточно хорош для указателей, которые я ищу.
Время: 6 секунд (без сортировки); около 35 секунд (с сортировкой)
Память: около 80 МБ (без сортировки); около 310 МБ (с сортировкой)
Примечание 1: память для меня является более серьезной проблемой, чем время, что касается текущей задачи. Я получаю ошибки памяти (использование памяти становится 3 ГБ! после 30 минут работы) -time)
Я предполагаю, что более быстрые алгоритмы также обеспечат печать памяти игрока, поэтому ищем время O(n).
Примечание 2: Я ищу быстрые алгоритмы для Int64, хотя быстрые алгоритмы для других конкретных типов также будут полезны.
Используемое решение: IntroSort с неупакованными векторами был достаточно хорош для моей задачи:
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