Алгоритмы сортировки данных известного статистического распределения? - PullRequest
60 голосов
/ 29 мая 2011

Мне просто пришло в голову, что если вы знаете что-то о распределении (в статистическом смысле) данных для сортировки, производительность алгоритма сортировки может выиграть, если вы примете эту информацию во внимание.

Итак, мой вопрос: существуют ли алгоритмы сортировки, учитывающие такую ​​информацию? Насколько они хороши?

Редактировать: пример для уточнения: если вы знаете, что ваши данные распределены по Гауссу, вы можете оценить среднее и среднее значение на лету при обработке данных. Это даст вам оценку окончательной позиции каждого числа, которую вы можете использовать, чтобы расположить их ближе к их конечной позиции.

Редактировать # 2: Я очень удивлен, что ответ - это не вики-ссылка на страницу, посвященную этой проблеме. Разве это не очень распространенный случай (например, случай Гаусса)?

Редактировать # 3: Я добавляю награду к этому вопросу, потому что я ищу конкретные ответы с источниками, а не спекуляции. Что-то вроде «в случае гауссовских распределенных данных алгоритм XYZ является самым быстрым в среднем, как было доказано Смитом и соавторами [1]». Однако любая дополнительная информация приветствуется.

Примечание : Я буду награждать награду за самый высокий голос. Голосуй с умом!

Ответы [ 7 ]

33 голосов
/ 29 мая 2011

Если данные, которые вы сортируете, имеют известное распределение, я бы использовал алгоритм Bucket Sort . Вы можете добавить к нему дополнительную логику, чтобы вычислить размер и / или положение различных сегментов на основе свойств распределения (например, для гауссовского, у вас может быть интервал каждый (sigma / k) от среднего значения, где сигма - стандартное отклонение распределения).

Имея известное распределение и модифицируя стандартный алгоритм сортировки по группам таким образом, вы, вероятно, получите алгоритм сортировка по гистограмме или что-то похожее на него. Конечно, ваш алгоритм будет в вычислительном отношении быстрее, чем алгоритм сортировки гистограммы, потому что, вероятно, не будет необходимости делать первый проход (описано в ссылке), поскольку вы уже знаете распределение.

Редактировать: с учетом ваших новых критериев вашего вопроса (хотя мой предыдущий ответ, касающийся сортировки по гистограмме, ссылается на респектабельный NIST и содержит информацию об эффективности), вот статья в журнале рецензирования Международной конференции по Параллельная обработка:

Адаптивный раздел данных для сортировки с использованием распределения вероятностей

Авторы утверждают, что этот алгоритм имеет лучшую производительность (до 30% лучше), чем популярный алгоритм быстрой сортировки.

18 голосов
/ 31 мая 2011

Звучит так, будто вы хотите прочитать Самосовершенствующиеся алгоритмы : они достигают возможного оптимального ожидаемого времени работы для произвольных входных распределений.

Мы даем такие самосовершенствующиеся алгоритмы для двух проблем: (I) сортировка последовательность чисел и (ii) вычисления триангуляция Делоне на плоскости точка установлена. Оба алгоритма достигают оптимальная ожидаемая предельная сложность. Алгоритмы начинаются с тренировки фаза, во время которой они собирают информация о входе распределение с последующим стационарным режим, в котором обосновываются алгоритмы к их оптимизированным воплощениям.

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

6 голосов
/ 01 июня 2011

Компьютерные алгоритмы сортировки можно разделить на две категории: сортировка на основе сравнения и сортировка на основе сравнения.Для сортировки на основе сравнения время сортировки в лучшем случае составляет Ω (nlogn), в то время как в худшем случае время сортировки может возрасти до O (n2).В последние годы были предложены некоторые улучшенные алгоритмы для ускорения сортировки на основе сравнения, такие как расширенная быстрая сортировка по характеристикам распределения данных.Однако среднее время сортировки для этих алгоритмов составляет всего Ω (nlog2n), и только в лучшем случае оно может достичь O (n).В отличие от сортировки на основе сравнения, сортировка без сравнения, такая как сортировка по количеству, сортировка по сегментам и сортировка по основанию, зависит главным образом от вычисления ключа и адреса.Когда значения ключей конечны в диапазоне от 1 до m, вычислительная сложность сортировки без сравнения составляет O (m + n).В частности, когда m = O (n), время сортировки может достигать O (n).Однако, когда m = n2, n3,…, верхняя граница времени линейной сортировки не может быть получена.Среди сортировки, не основанной на сравнении, сортировка по группам распределяет группу записей с похожими ключами в соответствующий «сегмент», затем к записям в каждом сегменте применяется другой алгоритм сортировки.При сортировке по группам разделение записей на m сегментов занимает меньше времени, в то время как в каждом сегменте будет содержаться только несколько записей, так что алгоритм «очистительной сортировки» может быть применен очень быстро.Следовательно, сортировка сегментов потенциально может асимптотически экономить время сортировки по сравнению с алгоритмами Ω (nlogn).Очевидно, что способ равномерного распределения всех записей в сегменты играет решающую роль в сортировке сегментов.Следовательно, вам нужен метод для построения хеш-функции в соответствии с распределением данных, который используется для равномерного распределения n записей в n сегментов на основе ключа каждой записи.Следовательно, время сортировки предлагаемого алгоритма сортировки сегментов при любых обстоятельствах достигнет O (n).

проверьте этот документ: http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=5170434&tag=1

6 голосов
/ 29 мая 2011

Зная распределение источников данных, можно построить хорошую хэш-функцию.Хорошо зная распределение, хеш-функция может оказаться идеальной хеш-функцией или близкой к идеальной для многих входных векторов.

Такая функция делит ввод размера n на n бинов, так что наименьший элементбудет отображаться в 1-й корзине, а самый большой элемент будет отображаться в последней корзине.Когда хеш совершенен - ​​мы добьемся сортировки, просто вставив все элементы в ячейки.

Вставка всех элементов в хеш-таблицу, затем их извлечение по порядку будет O (n), когда хеш равенсовершенный (при условии, что стоимость вычисления хеш-функции равна O (1), а операции над структурой хеш-данных подчеркивания - O (1)).

Я бы использовал массив кучи Фибоначчи для реализации хеш-таблицы.

Для входного вектора, для которого хеш-функция не будет идеальной (но все же близкой к идеальной), она все равно будет намного лучше, чем O (nlogn).Когда это идеально - это будет O (n).Я не уверен, как рассчитать среднюю сложность, но если бы пришлось, я бы сделал ставку на O (nloglogn).

5 голосов
/ 02 июня 2011

Сортировка сегментов даст вам алгоритм линейной сортировки по времени, при условии, что вы можете вычислить CDF каждой точки за O (1) времени.

Алгоритм, который вы также можете посмотреть в другом месте, выглядит следующим образом:

a = array(0, n - 1, [])          // create an empty list for each bucket
for x in input:
  a[floor(n * cdf(x))].append(x) // O(1) time for each x
input.clear()
for i in {0,...,n - 1}:
  // this sorting step costs O(|a[i]|^2) time for each bucket
  // but most buckets are small and the cost is O(1) per bucket in expectation
  insertion_sort(a[i])
  input.concatenate(a[i])

Время ожидания составляет O (n) в ожидании, потому что в ожидании есть O (n) пар (x, y), такие, что x и y попадают в один и тот же сегмент, а время выполнения сортировки вставки точно равно O ( n + # пар в одном ведре). Анализ аналогичен анализу статического хеширования FKS .

РЕДАКТИРОВАТЬ: Если вы не знаете распределение, но знаете, из какого он семейства, вы можете просто оценить распределение в O (n), в случае Гаусса, вычислив среднее значение и дисперсию, а затем использовать то же самое алгоритм (кстати, вычисление cdf в этом случае нетривиально).

4 голосов
/ 29 мая 2011

Вы можете использовать эту информацию в быстрой сортировке, чтобы выбрать значение поворота.Я думаю, что это повысило бы вероятность того, что алгоритм будет избегать сложности O (N ** 2) в худшем случае.

3 голосов
/ 04 июня 2011

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

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

...