Новости
О Центре
Кластер
Обучение
Основной курс по параллельному программированию
Учебные курсы
Магистратура
Дополнительное образование
Работы студентов
Библиотека
Исследования
Конференции
Полезные ссылки
NVIDIA
Контакты
О сайте
Имя:
Пароль:
запомнить:
Забыли пароль? Регистрация

Быстрая сортировка

Постановка задачи

Задача сортировки часто возникает при создании различных систем автоматизации обработки данных на базе ЭВМ. Под сортировкой подразумевают задачу размещения элементов неупорядоченного набора значений

в порядке монотонного возрастания (или убывания)

Для решения подобного рода задач разработано достаточно большое количество алгоритмов сортировки. Это разнообразие алгоритмов объясняется высокой трудоёмкостью решаемой задачи с одной стороны и большими объёмами входных данных с другой стороны. В итоге возникает необходимость максимально эффективно решать данную задачу обработки данных.

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

В данной работе рассмотрены последовательный и параллельный алгоритмы быстрой сортировки, предложенный Хоара (C.A.R. Hoare).

Метод решения

Последовательный алгоритм

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

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

Общая схема алгоритма быстрой сортировки может быть представлена в следующем виде (в качестве ведущего элемента выбирается средний элемент упорядочиваемого набора данных):

Параллельная схема

Параллельный алгоритм

Параллельное обобщение алгоритма быстрой сортировки наиболее простым способом может быть получено, если топология коммуникационной сети может быть эффективно представлена в виде N-мерного гиперкуба (т.е. p=2N). Пусть, как и ранее, исходный набор данных распределен между процессорами блоками одинакового размера n/p; результирующее расположение блоков должно соответствовать нумерации процессоров гиперкуба. Возможный способ выполнения первой итерации параллельного метода при таких условиях может состоять в следующем:

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

В результате выполнения такой итерации сортировки исходный набор оказывается разделенным на две части, одна из которых (со значениями меньшими, чем значение ведущего элемента) располагается на процессорах, в битовом представлении номеров которых бит N равен 0. Таких процессоров всего p/2, и, таким образом, исходный N-мерный гиперкуб также оказывается разделенным на два гиперкуба размерности N-1. К этим подгиперкубам, в свою очередь, может быть параллельно применена описанная выше процедура. После N-кратного повторения подобных итераций для завершения сортировки достаточно упорядочить блоки данных, получившиеся на каждом отдельном процессоре вычислительной системы.

Обобщенный алгоритм быстрой сортировки

В обобщенном алгоритме быстрой сортировки (the HyperQuickSort algorithm) в дополнение к обычному методу быстрой сортировки предлагается конкретный способ выбора ведущих элементов. Суть предложения состоит в том, что сортировка располагаемых на процессорах блоков происходит в самом начале выполнения вычислений. Кроме того, для поддержки упорядоченности в ходе вычислений процессоры должны выполнять операции слияния частей блоков, получаемых после разделения. Как результат, в силу упорядоченности блоков, при выполнении алгоритма быстрой сортировки в качестве ведущего элемента целесообразнее будет выбирать средний элемент какого-либо блока (например, на первом процессоре вычислительной системы). Выбираемый подобным образом ведущий элемент в отдельных случаях может оказаться более близким к реальному среднему значению всего сортируемого набора, чем какое-либо другое произвольно выбранное значение.

Все остальные действия в новом рассматриваемом алгоритме выполняются в соответствии с обычным методом быстрой сортировки.

Реализуемый алгоритм быстрой сортировки

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

  1. Распределяем исходный набор данных между процессорами блоками одинакового размера (в случае, если количество элементов в исходном наборе не кратно числу процессоров вычислительной системы размеры блоков различны, но отличаются не более чем на 1);
  2. Выполняем сортировку полученных блоков на каждом процессоре при помощи последовательного варианта алгоритма быстрой сортировки;
  3. В цикле по i от N до 1 делать:
    1. Выбираем ведущие элементы. Разбиваем исходный N – мерный гиперкуб (множество процессоров) на 2^i подгиперкубов. В каждом из образовавшихся подгиперкубов, в рамках процессора с наименьшим номером, выбираем ведущий (средний) элемент и рассылаем его значение всем остальным процессорам подгиперкуба; Заметим, что на i-ой итерации, каждый из подгиперкубов будут образовывать процессоры, в битовых представлениях номеров которых различаются i-ые позиции;
    2. На каждом процессоре разделяем имеющийся блок данных на две части с использованием полученного ведущего элемента;
    3. Образуем пары процессоров, для которых битовое представление их номеров отличается только в позиции (i+1), и осуществляем взаимообмен данными между этими процессорами; в результате таких пересылок данных, на процессорах, для которых в битовом представлении номера бит позиции (i+1) равен 0, должны оказаться части блоков со значениями, не превышающими значения ведущего элемента; процессоры с номерами, в которых бит (i+1) равен 1, должны собрать, соответственно, все значения данных, превышающие значение ведущего элемента;
  4. Пересылаем все блоки массива с каждого процессора на один процессор и собираем там массив из блоков согласно номерам процессоров, от которых эти блоки пришли.

Анализ эффективности

Оценим трудоемкость рассмотренного параллельного метода. Пусть у нас имеется N-мерный гиперкуб, состоящий из процессоров, где p < n.

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

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

Таким образом, общее время вычислений параллельного алгоритма быстрой сортировки составляет

где - есть время выполнения базовой операции перестановки.

Рассмотрим теперь сложность выполняемых коммуникационных операций. Общее количество межпроцессорных обменов для рассылки ведущего элемента на N-мерном гиперкубе может быть ограничено оценкой

При используемых предположениях (выбор ведущих элементов осуществляется наилучшим образом) количество итераций алгоритма равно , а объем передаваемых данных между процессорами всегда равен половине блока, т.е. величине (n/p)/2. При таких условиях коммуникационная сложность параллельного алгоритма быстрой сортировки определяется при помощи соотношения:

где – латентность, – пропускная способность сети, а есть размер элемента набора в байтах.

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

Результаты вычислительных экспериментов

Конфигурация системы

Процессор - Intel(R) Core(TM) i3 CPU 540 @ 3.07GHz
Оперативная память - 2 GB
Операционная система - MS Windows 7 x32
Компилятор - MS Visual Studio 2010

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

Об авторах

Работу выполнили студенты группы 83-03 Клян С.А, Тюлин Д.А.

Новости

22.10.2012
04.09.2012
05.04.2012
06.03.2012
02.03.2012