PSRS-сортировка — различия между версиями
AlexeyL (обсуждение | вклад) |
м (rollbackEdits.php mass rollback) |
||
(не показаны 4 промежуточные версии 3 участников) | |||
Строка 1: | Строка 1: | ||
− | = Описание = | + | == Описание == |
Parallel Sorting by Regular Sampling {{---}} параллельная сортировка, разработанная Ханмао Ши, Рисажем Канселом и Джонатаном Шеффером в 1992 году. Имеет два преимущества по сравнению с [[Быстрая сортировка|быстрой сортировкой]]: | Parallel Sorting by Regular Sampling {{---}} параллельная сортировка, разработанная Ханмао Ши, Рисажем Канселом и Джонатаном Шеффером в 1992 году. Имеет два преимущества по сравнению с [[Быстрая сортировка|быстрой сортировкой]]: | ||
* сохраняет размер списка более сбалансированным на протяжении всего процесса | * сохраняет размер списка более сбалансированным на протяжении всего процесса | ||
* избегает повторных перестановок ключей | * избегает повторных перестановок ключей | ||
− | = Алгоритм = | + | == Алгоритм == |
* Начало. | * Начало. | ||
* '''Шаг 1.''' Исходный массив в <tex>n</tex> элементов разделим поровну между <tex>p</tex> процессорами. | * '''Шаг 1.''' Исходный массив в <tex>n</tex> элементов разделим поровну между <tex>p</tex> процессорами. | ||
Строка 16: | Строка 16: | ||
* Конец. | * Конец. | ||
− | = Пример = | + | == Пример == |
Количество элементов <tex>27</tex>, количество процессоров <tex>3</tex>. | Количество элементов <tex>27</tex>, количество процессоров <tex>3</tex>. | ||
Исходный набор данных: | Исходный набор данных: | ||
Строка 108: | Строка 108: | ||
|} | |} | ||
− | = Анализ = | + | == Анализ == |
При <tex>n</tex> элементах и <tex>p</tex> процессорах начальная сортировка выполнится за <tex dpi=145>O( \frac {n\log(n/p)}{p})</tex>. Выбор порядка <tex>p</tex> элементов в каждом процессоре произойдёт за <tex>O(p)</tex>, их сортировать мы будем с помощью [[Быстрая сортировка|быстрой сортировки]], а так же учитывая, что их количество порядка <tex>p</tex>, то можно сказать, что они сортируются за <tex>O(p^2\log(p^2))=O(p^2\log(p))</tex>. | При <tex>n</tex> элементах и <tex>p</tex> процессорах начальная сортировка выполнится за <tex dpi=145>O( \frac {n\log(n/p)}{p})</tex>. Выбор порядка <tex>p</tex> элементов в каждом процессоре произойдёт за <tex>O(p)</tex>, их сортировать мы будем с помощью [[Быстрая сортировка|быстрой сортировки]], а так же учитывая, что их количество порядка <tex>p</tex>, то можно сказать, что они сортируются за <tex>O(p^2\log(p^2))=O(p^2\log(p))</tex>. | ||
Строка 121: | Строка 121: | ||
<tex dpi=145>O(\frac {n\log(n/p)}{p}+p^2\log(p)+n+p)=O(\frac {n\log(n/p)}{p})</tex>. | <tex dpi=145>O(\frac {n\log(n/p)}{p}+p^2\log(p)+n+p)=O(\frac {n\log(n/p)}{p})</tex>. | ||
− | = См. также = | + | == См. также == |
* [[Многопоточная сортировка слиянием|Многопоточная сортировка слиянием]] | * [[Многопоточная сортировка слиянием|Многопоточная сортировка слиянием]] | ||
* [[Быстрая сортировка|Быстрая сортировка]] | * [[Быстрая сортировка|Быстрая сортировка]] | ||
− | = Источники информации = | + | == Источники информации == |
* [https://wiki.engr.illinois.edu/download/attachments/99155993/Sort+ParaProg(Quinn)chpt14.5.pdf?version=1&modificationDate=1203641170000| Статья о PSRS] | * [https://wiki.engr.illinois.edu/download/attachments/99155993/Sort+ParaProg(Quinn)chpt14.5.pdf?version=1&modificationDate=1203641170000| Статья о PSRS] | ||
* [http://users.cms.caltech.edu/~cs284/lectures/29oct97/sld003.htm| Презентация] | * [http://users.cms.caltech.edu/~cs284/lectures/29oct97/sld003.htm| Презентация] | ||
Строка 130: | Строка 130: | ||
[[Категория:Дискретная математика и алгоритмы]] | [[Категория:Дискретная математика и алгоритмы]] | ||
[[Категория:Сортировка]] | [[Категория:Сортировка]] | ||
+ | [[Категория: Многопоточные сортировки]] |
Текущая версия на 19:15, 4 сентября 2022
Описание
Parallel Sorting by Regular Sampling — параллельная сортировка, разработанная Ханмао Ши, Рисажем Канселом и Джонатаном Шеффером в 1992 году. Имеет два преимущества по сравнению с быстрой сортировкой:
- сохраняет размер списка более сбалансированным на протяжении всего процесса
- избегает повторных перестановок ключей
Алгоритм
- Начало.
- Шаг 1. Исходный массив в элементов разделим поровну между процессорами.
- Шаг 2. На каждом процессоре запускам быструю сортировку.
- Шаг 3. Формируем вспомогательный массив из элементов каждого процессора под индексами .
- Шаг 4. Сортируем вспомогательный массив с помощью быстрой сортировки.
- Шаг 5. Формируем массив разделителей из элементов вспомогательного массива под индексами .
- Шаг 6. Делим данные в процессорах с помощью массива разделителей следующим образом. Пусть — разделители. Тогда данные в каждом процессоре разобьём на группы элементов, попадающие в соответствующие полуинтервалы .
- Шаг 7. Сливаем соответствующие группы элементов в массивы. Слияние будем производить поочерёдно, то есть сначала сольём первую группу со второй потом результат с третей и так далее. В итоге получим отсортированный набор данных.
- Шаг 8. Данные из процессоров поочерёдно записываем в исходный массив. Данные отсортированы.
- Конец.
Пример
Количество элементов
, количество процессоров . Исходный набор данных::
Описание этапа | 1 процессор | 2 процессор | 3 процессор |
---|---|---|---|
Разделение между процессорами | 15 46 48 93 39 6 72 91 14 | 36 69 40 89 61 97 12 21 54 | 53 97 84 58 32 27 33 72 20 |
После сортировки частей | 6 14 15 39 46 48 72 91 93 | 12 21 36 40 54 61 69 89 97 | 20 27 32 33 53 58 72 84 97 |
Выбор элементов | 6 14 15 39 46 48 72 91 93 | 12 21 36 40 54 61 69 89 97 | 20 27 32 33 53 58 72 84 97 |
Описание этапа | Данные |
---|---|
Выбранные элементы | 6 39 72 12 40 69 20 33 72 |
После сортировки | 6 12 20 33 39 40 69 72 72 |
Выбор элементов | 6 12 20 33 39 40 69 72 72 |
Разделители | 33 69 |
Описание этапа | 1 процессор | 2 процессор | 3 процессор | ||||||
---|---|---|---|---|---|---|---|---|---|
После сортировки частей | 6 14 15 | 39 46 48 | 72 91 93 | 12 21 | 36 40 54 61 69 | 89 97 | 20 27 32 33 | 53 58 | 72 84 97 |
После обмена данными | 6 14 15 | 12 21 | 20 27 32 33 | 39 46 48 | 36 40 54 61 69 | 53 58 | 72 91 93 | 89 97 | 72 84 97 |
После слияния | 6 12 14 | 15 20 21 | 27 32 33 | 36 39 40 | 46 48 53 | 54 58 61 69 | 72 72 | 84 89 91 | 93 97 97 |
Анализ
При быстрой сортировки, а так же учитывая, что их количество порядка , то можно сказать, что они сортируются за .
элементах и процессорах начальная сортировка выполнится за . Выбор порядка элементов в каждом процессоре произойдёт за , их сортировать мы будем с помощьюПосле обмена данными будет произведено слияние
массивов в каждом процессоре. Также мы должны помнить, что при равномерном распределении данных длина сливаемых массивов будет , а двух массивов выполняется за сумму их длин. Поэтому займёт .Откуда получаем итоговую асимптотику:
Что равно:
.