Воронкообразная сортировка
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
Funnelsort — это на основе сравнения алгоритм сортировки . Он похож на сортировку слиянием , но это алгоритм, не учитывающий кэш , разработанный для условий, когда количество элементов для сортировки слишком велико, чтобы поместиться в кэш , в котором выполняются операции. Он был представлен Маттео Фриго, Чарльзом Лейзерсоном , Харальдом Прокопом и Шридхаром Рамачандраном в 1999 году в контексте модели забвения кэша . [1] [2]
Математические свойства
[ редактировать ]В модели внешней памяти количество передач памяти, необходимое для выполнения своего рода предметы на машине с кэшем определенного размера и кэшировать строки длиной является , в предположении высокого кэша, что . Было показано, что это количество передач памяти асимптотически оптимально для сортировок сравнения. Funnelsort также обеспечивает асимптотически оптимальную сложность выполнения .
Алгоритм
[ редактировать ]Базовый обзор
[ редактировать ]Сортировка воронками работает с непрерывным массивом элементы. Для сортировки элементов он выполняет следующее:
- Разделить ввод на массивы размера и рекурсивно сортировать массивы.
- Объединить отсортированные последовательности с помощью -слияние. (Этот процесс будет описан более подробно.)
Сортировка воронками аналогична сортировке слиянием в том смысле, что некоторое количество подмассивов сортируется рекурсивно, после чего на этапе слияния подмассивы объединяются в один отсортированный массив. Объединение выполняется с помощью устройства, называемого k-merger, которое описано в разделе ниже.
к -слияния
[ редактировать ]A k -слияние занимает отсортированные последовательности. При одном вызове k-слияния он выводит первый элементы отсортированной последовательности, полученные путем слияния k входных последовательностей.
На верхнем уровне воронкообразная сортировка использует -слияние последовательности длины и вызывает это слияние один раз.
-слияние K строится рекурсивно из -слияния. Он состоит из вход -слияния и один выход -слияние . входов k разделены на наборы входы каждый. Каждый из этих наборов является входом для одного из входных слияний. Выход каждого входного слияния подключен к буферу, FIFO очереди , которая может хранить элементы. Буферы реализованы как циклические очереди .Результаты буферы подключаются ко входам выходного слияния . Наконец, вывод является результатом всего k-слияния.
В этой конструкции любое входное слияние выводит только элементы одновременно, но буфер, в который он выводит, имеет вдвое больше места. Это сделано для того, чтобы входное слияние можно было вызвать только тогда, когда в его буфере недостаточно элементов, но при вызове оно выводило сразу много элементов (а именно, из них).
K - слияние рекурсивно работает следующим образом. Для вывода элементы, он рекурсивно вызывает слияние выходных данных раз. Однако прежде чем он позвонит , он проверяет все свои буферы, заполняя каждый из них, который заполнен менее чем наполовину. Чтобы заполнить i-й буфер, он рекурсивно вызывает соответствующее слияние входных данных. один раз. Если это невозможно сделать (из-за исчерпания входных данных при слиянии), этот шаг пропускается. Поскольку этот вызов выводит элементов, буфер содержит как минимум элементы. В конце всех этих операций k -слияние выдало первый его входных элементов в отсортированном порядке.
Анализ
[ редактировать ]Большая часть анализа этого алгоритма вращается вокруг анализа пространства и сложности промахов в кэше k-слияния.
Первое важное ограничение состоит в том, что k-слияние может быть уложено в космос. Чтобы увидеть это, мы позволим обозначаем пространство, необходимое для k-слияния. Чтобы соответствовать буферы размера берет космос. Чтобы соответствовать меньшие буферы занимают космос. Таким образом, пространство удовлетворяет рекуррентности . Это повторение имеет решение .
Отсюда следует, что существует положительная константа так что проблема размера не более полностью помещается в кэш, а это означает, что он не вызывает дополнительных промахов в кэше.
Сдача в аренду обозначают количество промахов в кэше, вызванных вызовом k-слияния, можно показать, что Это делается с помощью индукционного рассуждения. Он имеет в качестве базового случая. Для большего k мы можем ограничить количество раз a -слияние называется. Выходное слияние называется именно раз. Общее количество вызовов при входных слияниях не более . Это дает общую границу рекурсивные вызовы. Кроме того, алгоритм проверяет каждый буфер на предмет необходимости заполнения. Это делается на буферизует каждый шаг для шаги, ведущие к максимуму кэш промахивается для всех проверок.
Это приводит к рецидиву , которое, как можно показать, имеет решение, указанное выше.
Наконец, общий кэш отсутствует ибо весь сорт можно проанализировать. Это удовлетворяет повторяемости Можно показать, что это имеет решение
Ленивая сортировка воронками
[ редактировать ]Ленивая сортировка воронками — это модификация сортировки воронок, представленная Гертом Столтингом Бродалем и Рольфом Фагербергом в 2002 году. [3] Модификация заключается в том, что при вызове слияния не требуется заполнять каждый из своих буферов. Вместо этого он лениво заполняет буфер только тогда, когда он пуст. Эта модификация имеет то же асимптотическое время выполнения и передачу памяти, что и исходная воронкообразная сортировка, но имеет применение в алгоритмах, не учитывающих кэш, для решения задач вычислительной геометрии в методе, известном как очистка распределения.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ М. Фриго, CE Лейзерсон, Х. Прокоп и С. Рамачандран. Алгоритмы, не обращающие внимания на кэш. В материалах 40-го симпозиума IEEE по основам информатики (FOCS 99), стр. 285–297. 1999. Расширенный реферат в IEEE , в Citeseer .
- ^ Харальд Прокоп. Алгоритмы, не обращающие внимания на кэш . Магистерская диссертация, Массачусетский технологический институт. 1999.
- ^ Бродал, Герт Столтинг ; Фагерберг, Рольф (25 июня 2002 г.). «Очистка распределения кэша, не обращающая внимания». Автоматы, языки и программирование . Конспекты лекций по информатике . Том. 2380. Спрингер . стр. 426–438. CiteSeerX 10.1.1.117.6837 . дои : 10.1007/3-540-45465-9_37 . ISBN 978-3-540-43864-9 . . См. также более подробный технический отчет .