Jump to content

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

Samplesort — это алгоритм сортировки , который представляет собой алгоритм «разделяй и властвуй», часто используемый в системах параллельной обработки. [1] Обычные алгоритмы сортировки «разделяй и властвуй» разделяют массив на подинтервалы или сегменты. Затем сегменты сортируются по отдельности, а затем объединяются вместе. Однако если массив распределен неравномерно, производительность этих алгоритмов сортировки может значительно снизиться. Выборочная сортировка решает эту проблему, выбирая выборку размером s из n -элементной последовательности и определяя диапазон сегментов путем сортировки выборки и выбора элементов p -1 < s из результата. Эти элементы (называемые разделителями) затем делят массив на p сегментов примерно одинакового размера. [2] Выборочная сортировка описана в статье 1970 года «Выборочная сортировка: выборочный подход к сортировке дерева минимальной памяти» У.Д. Фрейзера и А.К. МакКеллара. [3]

Алгоритм

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

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

Чтобы разработать реализацию выборочной сортировки, необходимо определиться с количеством сегментов p . Когда это будет сделано, фактический алгоритм работает в три этапа: [4]

  1. Отберите p -1 элементов со входа ( разделители ). Отсортируйте их; каждая пара соседних разделителей затем определяет сегмент .
  2. Перебирайте данные в цикле, помещая каждый элемент в соответствующий сегмент. (Это может означать: отправить его на процессор в многопроцессорной системе.)
  3. Отсортируйте каждое из ведер.

Полный отсортированный вывод представляет собой объединение сегментов.

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

Псевдокод

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

Следующий листинг показывает вышеупомянутый трехшаговый алгоритм в виде псевдокода и показывает, как алгоритм работает в принципе. [5] Далее A — это несортированные данные, k — коэффициент передискретизации, обсуждаемый позже, а p — количество разделителей.

function sampleSort(A[1..n], k, p)
    // if average bucket size is below a threshold switch to e.g. quicksort
    if n / k < threshold then smallSort(A) 
    /* Step 1 */
    select S = [S1, ..., S(p−1)k] randomly from // select samples
    sort S // sort sample
    [s0, s1, ..., sp−1, sp] <- [-∞, Sk, S2k, ..., S(p−1)k, ∞] // select splitters
    /* Step 2 */
    for each a in A
        find j such that sj−1 < a <= sj
        place a in bucket bj
    /* Step 3 and concatenation */
    return concatenate(sampleSort(b1), ..., sampleSort(bk))

Псевдокод отличается от исходного алгоритма Фрейзера и МакКеллара. [3] В псевдокоде выборочная сортировка вызывается рекурсивно. Фрейзер и МакКеллар вызвали выборочную сортировку только один раз и использовали быструю сортировку во всех последующих итерациях.

Сложность

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

Сложность, указанная в нотации Big O , для распараллеленной реализации с процессоры:

Найдите разделители.

Отправьте в ведра.

для чтения всех узлов
для вещания
для двоичного поиска по всем ключам
отправить ключи в ведро

Сортировка ведер.

где — это сложность базового метода последовательной сортировки. [1] Часто .

Количество сравнений, выполняемых этим алгоритмом, приближается к информационному теоретическому оптимуму. для больших входных последовательностей. В экспериментах, проведенных Фрейзером и МакКелларом, алгоритму требовалось на 15% меньше сравнений, чем быстрой сортировке.

Выборка данных

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

Данные могут быть отобраны различными методами. Некоторые методы включают в себя:

  1. Выбирайте образцы, расположенные на равном расстоянии друг от друга.
  2. Выберите случайно выбранные образцы.

Передискретизация

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

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

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

Оценка размера ковша

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

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

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

По ожидаемой стоимости держит:

Это будет использоваться для оценки :

Используя теперь оценку Чернова , можно показать:

Много одинаковых ключей

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

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

Использование в параллельных системах

[ редактировать ]
Пример параллельной Samplesort на процессоры и коэффициент передискретизации .

Выборочная сортировка часто используется в параллельных системах, включая распределенные системы, такие как синхронные параллельные машины. [6] [4] [7] Благодаря переменному количеству разделителей (в отличие от только одного центра в Quicksort ), Samplesort очень хорошо подходит и интуитивно понятен для распараллеливания и масштабирования. Более того, сортировка Samplesort также более эффективна с точки зрения кэширования, чем реализации, например, быстрой сортировки.

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

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

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

Эксперименты, проведенные в начале 1990-х годов на суперкомпьютерах Connection Machine , показали, что выборочная сортировка особенно хороша при сортировке больших наборов данных на этих машинах, поскольку она требует небольших накладных расходов на межпроцессорную связь. [8] На современных графических процессорах этот алгоритм может быть менее эффективным, чем его альтернативы. [9] [ нужна ссылка ]

Эффективная реализация Samplesort

[ редактировать ]
Анимированный пример суперскалярной выборочной сортировки. На каждом этапе сравниваемые числа отмечаются синим цветом, а числа, которые в противном случае читаются или записываются, отмечаются красным.

Как описано выше, алгоритм выборочной сортировки разделяет элементы в соответствии с выбранными разделителями. Эффективная стратегия реализации предложена в статье «Суперскалярная выборочная сортировка». [5] Предлагаемая в статье реализация использует два массива размером (исходный массив, содержащий входные данные и временный) для эффективной реализации. Следовательно, эта версия реализации не является алгоритмом на месте.

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

Определение сегментов

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

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

Суперскалярная выборочная сортировка использует сбалансированное дерево поиска, которое неявно хранится в массиве t . Корень хранится в 0, левый преемник хранится в и правильный преемник хранится по адресу . Учитывая дерево поиска t , алгоритм вычисляет номер сегмента j элемента следующим образом (при условии, что оценивается как 1, если это правда , и 0 в противном случае):

j := 1
repeat log2(p) times
    j := 2j + (a > tj)
j := jp + 1

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

Разделение

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

Для эффективного разделения элементов алгоритму необходимо заранее знать размеры сегментов. Чтобы разделить элементы последовательности и поместить их в массив, нам нужно заранее знать размер сегментов. Наивный алгоритм мог бы подсчитать количество элементов каждого сегмента. Затем элементы можно было бы вставить в другой массив в нужном месте. Используя это, необходимо дважды определить сегмент для каждого элемента (один раз для подсчета количества элементов в блоке и один раз для их вставки).

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

Выборочная сортировка на месте

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

Ключевым недостатком эффективной реализации Samplesort, показанной выше, является то, что она не находится на месте и требует второго временного массива того же размера, что и входная последовательность во время сортировки. Эффективные реализации, например, быстрой сортировки, находятся на месте и, следовательно, более экономичны. Однако Samplesort также можно реализовать на месте. [10]

Алгоритм на месте разделен на четыре этапа:

  1. Выборка , которая эквивалентна выборке в вышеупомянутой эффективной реализации.
  2. Локальная классификация на каждом процессоре, которая группирует входные данные в блоки так, что все элементы в каждом блоке принадлежат одному и тому же сегменту, но сегменты не обязательно непрерывны в памяти.
  3. Перестановка блоков приводит блоки в глобально правильный порядок.
  4. При очистке перемещаются некоторые элементы по краям сегментов.

Одним из очевидных недостатков этого алгоритма является то, что он считывает и записывает каждый элемент дважды: один раз на этапе классификации и один раз на этапе перестановки блоков. Однако алгоритм работает до трех раз быстрее, чем другие современные конкуренты, работающие на месте, и до 1,5 раз быстрее, чем другие современные последовательные конкуренты. Поскольку выборка уже обсуждалась выше, три последующих этапа будут более подробно описаны ниже.

Местная классификация

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

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

Перестановка блоков

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

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

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

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

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

См. также

[ редактировать ]
  1. ^ Jump up to: Перейти обратно: а б «Выборочная сортировка с использованием стандартной адаптивной параллельной библиотеки шаблонов» (PDF) (технический отчет). Техасский университет A&M.
  2. ^ Грама, Анант; Карипис, Георгий; Кумар, Випин (2003). «9.5 Ведро и выборочная сортировка» . Введение в параллельные вычисления (2-е изд.). ISBN  0-201-64865-2 . Архивировано из оригинала 13 декабря 2016 г. Проверено 28 октября 2014 г.
  3. ^ Jump up to: Перейти обратно: а б Фрейзер, штат Вашингтон; МакКеллар, AC (1 июля 1970 г.). «Выборочная сортировка: выборочный подход к сортировке дерева с минимальным объемом памяти» . Журнал АКМ . 17 (3): 496–507. дои : 10.1145/321592.321600 . S2CID   16958223 .
  4. ^ Jump up to: Перейти обратно: а б Хилл, Джонатан, доктор медицины; Макколл, Билл; Стефанеску, Дэн С.; Гудро, Марк В.; Ланг, Кевин; Рао, Сатиш Б.; Суэл, Торстен; Цантилас, Танасис; Бисселинг, Роб Х. (1998). «BSPlib: Библиотека программирования BSP». Параллельные вычисления . 24 (14): 1947–1980. CiteSeerX   10.1.1.48.1862 . дои : 10.1016/S0167-8191(98)00093-3 .
  5. ^ Jump up to: Перейти обратно: а б Сандерс, Питер; Винкель, Себастьян (14 сентября 2004 г.). «Суперскалярная выборочная сортировка». Алгоритмы – ЕКА 2004 . Конспекты лекций по информатике. Том. 3221. стр. 784–796. CiteSeerX   10.1.1.68.9881 . дои : 10.1007/978-3-540-30140-0_69 . ISBN  978-3-540-23025-0 .
  6. ^ Гербессиотис, Александрос В.; Валиант, Лесли Г. (1992). «Прямые синхронно-параллельные алгоритмы». J. Параллельные и распределенные вычисления . 22 : 22–251. CiteSeerX   10.1.1.51.9332 .
  7. ^ Хайтауэр, Уильям Л.; Принс, Ян Ф.; Рейф, Джон Х. (1992). Реализации рандомизированной сортировки на больших параллельных машинах (PDF) . ACM симп. по параллельным алгоритмам и архитектурам.
  8. ^ Блеллох, Гай Э .; Лейзерсон, Чарльз Э .; Мэггс, Брюс М.; Плакстон, К. Грегори; Смит, Стивен Дж.; Зага, Марко (1991). Сравнение алгоритмов сортировки соединительной машины СМ-2 . ACM симп. по параллельным алгоритмам и архитектурам. CiteSeerX   10.1.1.131.1835 .
  9. ^ Сатиш, Надатур; Харрис, Марк; Гарланд, Майкл. Разработка эффективных алгоритмов сортировки для многоядерных графических процессоров . Учеб. IEEE Int'l Parallel and Distributed Processing Symp. CiteSeerX   10.1.1.190.9846 .
  10. ^ Астманн, Майкл; Витт, Саша; Феризович, Дэниел; Сандерс, Питер (2017). «Параллельная суперскалярная выборка на месте (IPSSSSo)». 25-й ежегодный европейский симпозиум по алгоритмам (ESA 2017) . 87 (Международные труды Лейбница по информатике (LIPIcs)): 9:1–9:14. doi : 10.4230/LIPIcs.ESA.2017.9 .
[ редактировать ]

Сортировка и производные Фрейзера и МакКеллара:

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 971db136e59829661085a5b47a4ade8b__1702228920
URL1:https://arc.ask3.ru/arc/aa/97/8b/971db136e59829661085a5b47a4ade8b.html
Заголовок, (Title) документа по адресу, URL1:
Samplesort - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)