Участник:Ashabokov 415/Алгоритм быстрой сортировки: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 4: Строка 4:
  
 
=== Общее описание алгоритма <ref> https://en.wikipedia.org/wiki/Quicksort — From Wikipedia, the free encyclopedia </ref> ===
 
=== Общее описание алгоритма <ref> https://en.wikipedia.org/wiki/Quicksort — From Wikipedia, the free encyclopedia </ref> ===
 +
 +
 +
=== Ресурс параллелизма алгоритма ===
 
Основной идеей данного алгоритма является разбиение всего массива данных на блоки меньшего размера таким образом, что между соответствующими блоками после разбиения можно установить отношение упорядоченности. Сортировка производится следующим образом: выбирается некоторым образом ведущий элемент, после чего происходит разделение исходного массива данных на два блока относительно ведущего элемента: в первый блок помещаются элементы, меньшие ведущего, а во второй — большие ведущего. Таким образом, можно утверждать, что наибольший элемент первого блока меньше наименьшего элемента второго блока. Это означает, что повторив эту операцию для каждого из блоков отдельно некоторое количество раз и объединив результаты, получим массив с исходными данными в отсортированном виде. Из описания становится очевидно, что данный алгоритм можно легко обобщить для параллельной вычислительной системы с количеством процессоров <math>p = 2^n</math>. Для этого алгоритм необходимо лишь дополнить методом выбора процессоров, между которыми будут происходить обмены данными на i-ом шаге. Распределим произвольным образом данные между процессорами, далее выбираем некоторым образом ведущий элемент и рассылаем его всем процессорам системы. Т.к. топология системы имеет вид n-мерного куба, номер каждого процессора имеет двоичное представление длины <math>n</math>, следовательно, можно ввести правило: на каждом процессоре происходит сравнение имеющегося блока данных с текущим ведущим элементом, после чего элементы меньше ведущего отправляются от процессора с номером <math>n_1</math> процессору номер <math>n_2</math>, где <math>n_1</math> отличается от <math>n_2</math> только в n-том разряде двоичного представления, в двоичном представлении числа <math>n_1</math> на n-той позиции стоит 1, а <math>n_2</math> — 0. Таким образом, после данной операции все данные будут разделены между процессорами, образующими n-1-мерные кубы таким образом, что элемент блока данных любого процессора из первого куба больше любого элемента блока данных процессора из второго куба. Повторив аналогичные действия для каждого из n-1-мерных кубов, получим 4 n-2-мерных куба и т.д. Последним этапом работы алгоритма является объединение разрозненных блоков отсортированных данных в единый массив в правильном порядке. Порядок объединения не трудно восстановить исходя из двоичных представлений номеров процессоров.
 
Основной идеей данного алгоритма является разбиение всего массива данных на блоки меньшего размера таким образом, что между соответствующими блоками после разбиения можно установить отношение упорядоченности. Сортировка производится следующим образом: выбирается некоторым образом ведущий элемент, после чего происходит разделение исходного массива данных на два блока относительно ведущего элемента: в первый блок помещаются элементы, меньшие ведущего, а во второй — большие ведущего. Таким образом, можно утверждать, что наибольший элемент первого блока меньше наименьшего элемента второго блока. Это означает, что повторив эту операцию для каждого из блоков отдельно некоторое количество раз и объединив результаты, получим массив с исходными данными в отсортированном виде. Из описания становится очевидно, что данный алгоритм можно легко обобщить для параллельной вычислительной системы с количеством процессоров <math>p = 2^n</math>. Для этого алгоритм необходимо лишь дополнить методом выбора процессоров, между которыми будут происходить обмены данными на i-ом шаге. Распределим произвольным образом данные между процессорами, далее выбираем некоторым образом ведущий элемент и рассылаем его всем процессорам системы. Т.к. топология системы имеет вид n-мерного куба, номер каждого процессора имеет двоичное представление длины <math>n</math>, следовательно, можно ввести правило: на каждом процессоре происходит сравнение имеющегося блока данных с текущим ведущим элементом, после чего элементы меньше ведущего отправляются от процессора с номером <math>n_1</math> процессору номер <math>n_2</math>, где <math>n_1</math> отличается от <math>n_2</math> только в n-том разряде двоичного представления, в двоичном представлении числа <math>n_1</math> на n-той позиции стоит 1, а <math>n_2</math> — 0. Таким образом, после данной операции все данные будут разделены между процессорами, образующими n-1-мерные кубы таким образом, что элемент блока данных любого процессора из первого куба больше любого элемента блока данных процессора из второго куба. Повторив аналогичные действия для каждого из n-1-мерных кубов, получим 4 n-2-мерных куба и т.д. Последним этапом работы алгоритма является объединение разрозненных блоков отсортированных данных в единый массив в правильном порядке. Порядок объединения не трудно восстановить исходя из двоичных представлений номеров процессоров.
 
=== Математическое описание алгоритма ===
 
  
 
Очевидно, что наиболее медленной операцией в описанной выше схеме является операция обмена данными между процессорами, следовательно, хотелось бы получить некоторую оценку количества обменов. Такая оценка приведена ниже:
 
Очевидно, что наиболее медленной операцией в описанной выше схеме является операция обмена данными между процессорами, следовательно, хотелось бы получить некоторую оценку количества обменов. Такая оценка приведена ниже:
Строка 13: Строка 14:
  
 
где <math> p </math> — количество задействованных процессоров.
 
где <math> p </math> — количество задействованных процессоров.
 +
 +
=== Входные и выходные данные алгоритма ===
 +
'''Входные данные:''' любая числовая последовательность произвольной конечной длины. Так как параллельный алгоритм предполагает поиск разделяющего элемента случайным образом, построение последовательностей специальных видов не приводит к увеличению вероятности неравномерного распределения данных между вычислительными узлами.
 +
'''Выходные данные:''' последовательность чисел в отсортированном виде.
  
 
== Литература ==
 
== Литература ==
 
<references />
 
<references />

Версия 02:53, 30 ноября 2019

Алгоритм быстрой сортировки

1 Свойства и структура алгоритмов

1.1 Общее описание алгоритма [1]

1.2 Ресурс параллелизма алгоритма

Основной идеей данного алгоритма является разбиение всего массива данных на блоки меньшего размера таким образом, что между соответствующими блоками после разбиения можно установить отношение упорядоченности. Сортировка производится следующим образом: выбирается некоторым образом ведущий элемент, после чего происходит разделение исходного массива данных на два блока относительно ведущего элемента: в первый блок помещаются элементы, меньшие ведущего, а во второй — большие ведущего. Таким образом, можно утверждать, что наибольший элемент первого блока меньше наименьшего элемента второго блока. Это означает, что повторив эту операцию для каждого из блоков отдельно некоторое количество раз и объединив результаты, получим массив с исходными данными в отсортированном виде. Из описания становится очевидно, что данный алгоритм можно легко обобщить для параллельной вычислительной системы с количеством процессоров [math]p = 2^n[/math]. Для этого алгоритм необходимо лишь дополнить методом выбора процессоров, между которыми будут происходить обмены данными на i-ом шаге. Распределим произвольным образом данные между процессорами, далее выбираем некоторым образом ведущий элемент и рассылаем его всем процессорам системы. Т.к. топология системы имеет вид n-мерного куба, номер каждого процессора имеет двоичное представление длины [math]n[/math], следовательно, можно ввести правило: на каждом процессоре происходит сравнение имеющегося блока данных с текущим ведущим элементом, после чего элементы меньше ведущего отправляются от процессора с номером [math]n_1[/math] процессору номер [math]n_2[/math], где [math]n_1[/math] отличается от [math]n_2[/math] только в n-том разряде двоичного представления, в двоичном представлении числа [math]n_1[/math] на n-той позиции стоит 1, а [math]n_2[/math] — 0. Таким образом, после данной операции все данные будут разделены между процессорами, образующими n-1-мерные кубы таким образом, что элемент блока данных любого процессора из первого куба больше любого элемента блока данных процессора из второго куба. Повторив аналогичные действия для каждого из n-1-мерных кубов, получим 4 n-2-мерных куба и т.д. Последним этапом работы алгоритма является объединение разрозненных блоков отсортированных данных в единый массив в правильном порядке. Порядок объединения не трудно восстановить исходя из двоичных представлений номеров процессоров.

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

[math]\sum_{i=1}^{n} i = n(n+1)/2 ≈ \log^2 p [/math] [2],

где [math] p [/math] — количество задействованных процессоров.

1.3 Входные и выходные данные алгоритма

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

2 Литература

  1. https://en.wikipedia.org/wiki/Quicksort — From Wikipedia, the free encyclopedia
  2. http://ssd.sscc.ru/ru — Supercomputer Software Department