Я очень новичок в Haskell, и у меня вопрос о том, какие улучшения производительности могут быть сделаны с использованием нечистых (изменяемых) структур данных. Я пытаюсь собрать несколько разных вещей, которые я слышал, поэтому, пожалуйста, несите меня, если моя терминология не совсем правильна, или если есть небольшие ошибки.
Чтобы сделать это конкретным, рассмотрим алгоритм быстрой сортировки (взятый из Haskell wiki).
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
Это не "настоящая быстрая сортировка". "Истинный" алгоритм быстрой сортировки на месте, и это не так. Это очень неэффективно.
С другой стороны, в Haskell можно использовать векторы для реализации быстродействующей сортировки на месте. Пример приведен в qaru.site/info/65419/....
Насколько быстрее второй алгоритм, чем первый? Нотация Big O здесь не помогает, поскольку улучшение производительности будет более эффективно использовать память, не имея лучшего алгоритма (правильно?). Я устал строить свои собственные тесты, но мне трудно было работать.
Идеальный ответ дал бы некоторое представление о том, что делает алгоритм на месте Haskell быстрее теоретически, и пример сравнения времени работы над некоторым набором тестовых данных.