2013-06-23 4 views
4

Я пишу программу, которая собирается генерировать кучу данных. Я бы хотел найти различные проценты по этим данным.Computing процентили

Очевидный способ сделать это - хранить данные в каком-то сортированном контейнере. Существуют ли библиотеки Haskell, которые предлагают контейнер, который автоматически сортируется и предлагает быстрый случайный доступ к произвольным индексам?

Альтернативой является использование неупорядоченного контейнера и выполнение сортировки в конце. Я не знаю, будет ли это быстрее. В любом случае, нам все еще остается необходимость в контейнере, который предлагает быстрый произвольный доступ. (Массив, возможно ...)

Предложения?

(Еще одна альтернатива - построить гистограмму, а не хранить весь набор данных в памяти. Но поскольку цель состоит в том, чтобы вычислить процентили очень точно, я не желаю идти по этому пути. Я также не знаю диапазон моих данных до тех пор, пока я не сгенерирую его ...)

+2

Выполняют ли потоковые алгоритмы, такие как описанные в http://stackoverflow.com/questions/1248815/percentiles-of-live-data-capture, в соответствии с вашими потребностями? –

+0

@JeffFoster Это похоже на то, что я пытаюсь сделать. Я не уверен, будет ли этот подход работать, но его стоит исследовать. – MathematicalOrchid

ответ

5

Существуют ли библиотеки Haskell, которые предлагают контейнер, который автоматически сортируется и предлагает быстрый случайный доступ к произвольным индексам?

Да, это ваш старый добрый Data.Map. См. elemAt и другие функции в категории «Индексированные».

Data.Set не предлагает их, но вы можете эмулировать его с помощью Data.Map YourType().

+0

Huh. Я понятия не имел, что карта может это сделать ... спасибо за подсказку. – MathematicalOrchid

+1

@MathematicsOrchid: Простое увеличение дерева поиска для поддержки операции 'select'. Просто сохраните размеры поддерева в каждом узле :) Поэтому неудивительно, что это было реализовано в 'Map' –