Jump to content

Воронкообразная сортировка

Funnelsort — это на основе сравнения алгоритм сортировки . Он похож на сортировку слиянием , но это алгоритм, не учитывающий кэш , разработанный для условий, когда количество элементов для сортировки слишком велико, чтобы поместиться в кэш , в котором выполняются операции. Он был представлен Маттео Фриго, Чарльзом Лейзерсоном , Харальдом Прокопом и Шридхаром Рамачандраном в 1999 году в контексте модели забвения кэша . [1] [2]

Математические свойства

[ редактировать ]

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

Алгоритм

[ редактировать ]

Базовый обзор

[ редактировать ]

Сортировка воронками работает с непрерывным массивом элементы. Для сортировки элементов он выполняет следующее:

  1. Разделить ввод на массивы размера и рекурсивно сортировать массивы.
  2. Объединить отсортированные последовательности с помощью -слияние. (Этот процесс будет описан более подробно.)

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

к -слияния

[ редактировать ]

A k -слияние занимает отсортированные последовательности. При одном вызове k-слияния он выводит первый элементы отсортированной последовательности, полученные путем слияния k входных последовательностей.

На верхнем уровне воронкообразная сортировка использует -слияние последовательности длины и вызывает это слияние один раз.

-слияние K строится рекурсивно из -слияния. Он состоит из вход -слияния и один выход -слияние . входов k разделены на наборы входы каждый. Каждый из этих наборов является входом для одного из входных слияний. Выход каждого входного слияния подключен к буферу, FIFO очереди , которая может хранить элементы. Буферы реализованы как циклические очереди .Результаты буферы подключаются ко входам выходного слияния . Наконец, вывод является результатом всего k-слияния.

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

K - слияние рекурсивно работает следующим образом. Для вывода элементы, он рекурсивно вызывает слияние выходных данных раз. Однако прежде чем он позвонит , он проверяет все свои буферы, заполняя каждый из них, который заполнен менее чем наполовину. Чтобы заполнить i-й буфер, он рекурсивно вызывает соответствующее слияние входных данных. один раз. Если это невозможно сделать (из-за исчерпания входных данных при слиянии), этот шаг пропускается. Поскольку этот вызов выводит элементов, буфер содержит как минимум элементы. В конце всех этих операций k -слияние выдало первый его входных элементов в отсортированном порядке.

Большая часть анализа этого алгоритма вращается вокруг анализа пространства и сложности промахов в кэше k-слияния.

Первое важное ограничение состоит в том, что k-слияние может быть уложено в космос. Чтобы увидеть это, мы позволим обозначаем пространство, необходимое для k-слияния. Чтобы соответствовать буферы размера берет космос. Чтобы соответствовать меньшие буферы занимают космос. Таким образом, пространство удовлетворяет рекуррентности . Это повторение имеет решение .

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

Сдача в аренду обозначают количество промахов в кэше, вызванных вызовом k-слияния, можно показать, что Это делается с помощью индукционного рассуждения. Он имеет в качестве базового случая. Для большего k мы можем ограничить количество раз a -слияние называется. Выходное слияние называется именно раз. Общее количество вызовов при входных слияниях не более . Это дает общую границу рекурсивные вызовы. Кроме того, алгоритм проверяет каждый буфер на предмет необходимости заполнения. Это делается на буферизует каждый шаг для шаги, ведущие к максимуму кэш промахивается для всех проверок.

Это приводит к рецидиву , которое, как можно показать, имеет решение, указанное выше.

Наконец, общий кэш отсутствует ибо весь сорт можно проанализировать. Это удовлетворяет повторяемости Можно показать, что это имеет решение

Ленивая сортировка воронками

[ редактировать ]

Ленивая сортировка воронками — это модификация сортировки воронок, представленная Гертом Столтингом Бродалем и Рольфом Фагербергом в 2002 году. [3] Модификация заключается в том, что при вызове слияния не требуется заполнять каждый из своих буферов. Вместо этого он лениво заполняет буфер только тогда, когда он пуст. Эта модификация имеет то же асимптотическое время выполнения и передачу памяти, что и исходная воронкообразная сортировка, но имеет применение в алгоритмах, не учитывающих кэш, для решения задач вычислительной геометрии в методе, известном как очистка распределения.

См. также

[ редактировать ]
  1. ^ М. Фриго, CE Лейзерсон, Х. Прокоп и С. Рамачандран. Алгоритмы, не обращающие внимания на кэш. В материалах 40-го симпозиума IEEE по основам информатики (FOCS 99), стр. 285–297. 1999. Расширенный реферат в IEEE , в Citeseer .
  2. ^ Харальд Прокоп. Алгоритмы, не обращающие внимания на кэш . Магистерская диссертация, Массачусетский технологический институт. 1999.
  3. ^ Бродал, Герт Столтинг ; Фагерберг, Рольф (25 июня 2002 г.). «Очистка распределения кэша, не обращающая внимания». Автоматы, языки и программирование . Конспекты лекций по информатике . Том. 2380. Спрингер . стр. 426–438. CiteSeerX   10.1.1.117.6837 . дои : 10.1007/3-540-45465-9_37 . ISBN  978-3-540-43864-9 . . См. также более подробный технический отчет .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 3fcecd0fdafdeccd20f70bd0839b7da3__1722386340
URL1:https://arc.ask3.ru/arc/aa/3f/a3/3fcecd0fdafdeccd20f70bd0839b7da3.html
Заголовок, (Title) документа по адресу, URL1:
Funnelsort - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)