Аноним

Внешние сортировка и перестановка: различия между версиями

Материал из WEGA
м
(Новая страница: «== Ключевые слова и синонимы == Сортировка во внешней памяти == Постановка задачи == Нотаци…»)
 
 
(не показано 20 промежуточных версий этого же участника)
Строка 3: Строка 3:


== Постановка задачи ==
== Постановка задачи ==
Нотация. Основные свойства магнитных дисков и многодисковых систем можно отразить с помощью широко используемой модели с параллельными дисками (PDM), которая кратко представлена ниже в ее актуальной форме, разработанной Виттером и Шрайвер [16]:
'''Нотация'''. Основные свойства магнитных дисков и многодисковых систем можно отразить с помощью широко используемой ''модели с параллельными дисками'' (PDM), которая кратко представлена ниже в ее актуальной форме, разработанной Виттером и Шрайвер [16]:
N – размер задачи (в единицах элементов данных); M – размер внутренней памяти (в единицах элементов данных); В – размер блока для поблочной передачи (в единицах элементов данных); D – количество независимых дисковых накопителей; P – количество центральных процессоров;
 
где M < N и 1 < DB < M/2. Предполагается, что элементы данных имеют фиксированную длину. За одну операцию ввода-вывода каждый из D дисков может одновременно передать блок из B смежных элементов данных. (В оригинальной статье 1988 года [ ] допускалось, что за одну операцию ввода-вывода с одного и того же диска могут поступать D блоков, что на практике нереально). Если P < D, каждый из P процессоров может управлять примерно D/P дисками; если D < P, с каждым диском работают примерно P/D процессоров. Объем внутренней памяти составляет M/P на процессор; P процессоров соединены сетью межсоединений.
  N – размер задачи (в единицах элементов данных);  
  M – размер внутренней памяти (в единицах элементов данных);  
  В – размер блока для поблочной передачи (в единицах элементов данных);  
  D – количество независимых дисковых накопителей;  
  P – количество процессоров;
 
где <math>M < N</math> и <math>1 \le DB \le M/2</math>. Предполагается, что элементы данных имеют фиксированную длину. За одну операцию ввода-вывода каждый из D дисков может одновременно передать блок из B смежных элементов данных. (В оригинальной статье 1988 года [2] допускалось, что за одну операцию ввода-вывода с одного и того же диска могут поступать D блоков, что на практике нереально). Если <math>P \le D</math>, каждый из P процессоров может управлять примерно D/P дисками; если D < P, с каждым диском работают примерно P/D процессоров. Объем внутренней памяти составляет M/P на процессор; P процессоров соединены сетью межсоединений.




Некоторые из перечисленных выше параметров PDM удобно указывать в единицах дисковых блоков, а не в единицах элементов данных; получаемые в результате формулы часто упрощаются. Будем обозначать строчными буквами
Некоторые из перечисленных выше параметров PDM удобно указывать в единицах дисковых блоков, а не в единицах элементов данных; получаемые в результате формулы часто упрощаются. Будем обозначать строчными буквами
(1) <math>n = \frac{N}{B}, m = \frac{M}{B}, q = \frac{Q}{B}, z = \frac{Z}{B}</math>


размер входных данных задачи, размер внутренней памяти, размер спецификации запроса и размер выходных данных запроса, соответственно, в единицах дисковых блоков.
размер входных данных задачи, размер внутренней памяти, размер спецификации запроса и размер выходных данных запроса, соответственно, в единицах дисковых блоков.
Строка 25: Строка 33:




Задача 1 (Внешняя сортировка)
'''Задача 1 (Внешняя сортировка)'''


Дано: записи входных данных R0, R1, R2, . . изначально распределены чередующимся образом по D дискам в виде блоков, так что запись Ri находится в блоке bi/Bc, а блок ј хранится на диске j mod D.
Дано: записи входных данных <math>R_0, R_1, R_2, ...</math> изначально распределены в виде чередующихся полос по D дискам в виде блоков, так что запись <math>R_i</math> находится в блоке <math>\lfloor i/B \rfloor</math>, а блок ј хранится на диске j mod D.


Требуется: найти чередующееся представление переставленного (перестановочного) упорядочения -R(j(o), Ra(\)> R<J(2)> входных записей, обладающее следующим свойством: keyiRcr^)) < кеу(Д<7(,+1)) для всех i > 0.
Требуется: найти чередующееся представление перестановочного упорядочения <math>R_{\sigma(0)}, R_{\sigma(1)}, R_{\sigma(2)}, ...</math> входных записей, обладающее следующим свойством: <math>key(R_{\sigma(i)}) \le key(R_{\sigma(i + 1)})</math> для всех <math>i \ge 0</math>.




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


Задача 2 (Перестановка)
'''Задача 2 (Перестановка)'''
 
Дано: те же исходные предположения, что и в задаче внешней сортировки. Кроме того, задана перестановка a целых чисел f0; 1; 2...  N — 1g.


Требуется: найти чередующееся представление переставленного (перестановочного) упорядочения Rcr^); Ra{1); Rcr{2) входных записей.
Дано: те же исходные предположения, что и в задаче внешней сортировки. Кроме того, задана перестановка <math>\sigma</math> целых чисел {0, 1, 2, ... N — 1}.


Требуется: найти чередующееся представление перестановочного упорядочения <math>R_{\sigma(0)}, R_{\sigma(1)}, R_{\sigma(2)}, ...</math> входных записей.


== Основные результаты ==
== Основные результаты ==


Теорема 1 [2, 12]. Количество операций ввода-вывода, необходимых для сортировки N = nB элементов данных с использованием D дисков в среднем и наихудшем случаях, составляет
'''Теорема 1 [2, 12]. Количество операций ввода-вывода, необходимых для сортировки N = nB элементов данных с использованием D дисков в среднем и наихудшем случаях, составляет'''


(2)
(2) <math>Sort(N) = \Theta (\frac{n}{D} log_m \; n).</math>




Теорема 2 [ ]. Количество операций ввода-вывода, необходимых для перестановки N элементов данных с использованием D дисков в среднем и наихудшем случаях, составляет
'''Теорема 2 [2]. Количество операций ввода-вывода, необходимых для перестановки N элементов данных с использованием D дисков в среднем и наихудшем случаях, составляет'''


(3)
(3) <math>\Theta \bigg( min \bigg\{ \frac{N}{D}, Sort(N) \bigg\} \bigg).</math>




Строка 57: Строка 64:




Теорема 3 [2]. При наличии D дисков количество операций ввода-вывода, необходимых для транспонирования матрицы p x q из развертывания по строкам на развертывание по столбцам, равно
'''Теорема 3 [2]. При наличии D дисков количество операций ввода-вывода, необходимых для транспонирования матрицы <math>p \times q</math> из развертывания по строкам на развертывание по столбцам, равно'''
 
(4)


где N = pq и n = N/B.
(4) <math>\Theta \bigg( \frac{n}{D} log_m \; min \{ M, p, q, n \} \bigg),</math> '''где <math>N = pq</math> и <math>n = N/B.</math>'''




Транспонирование матриц является частным случаем более общего класса перестановок, называемых перестановками типа «перестановка битов и дополнение» (BPC), которые, в свою очередь, являются подмножеством класса перестановок типа «перемножение битовых матриц и дополнение» (BMMC). BMMC-перестановки определяются неособенной матрицей A размера log N x log N, содержащей только нули и единицы, и вектором длины log N с такими же элементами. Элемент с двоичным адресом x отображается перестановкой на двоичный адрес, заданный Ax ф c, где В обозначает поразрядное исключающее «ИЛИ». BPC-перестановки являются частным случаем BMMC-перестановок, в котором A является матрицей перестановок, то есть каждая строка и каждый столбец A содержат по одному значению 1. BPC-перестановки включают в себя транспонирование матрицы, бит-реверсивную перестановку (которая возникает при быстром преобразовании Фурье), обращение векторов, перестановку элементов гиперкуба и переблокировку матрицы. Кормен и коллеги [6] характеризуют оптимальное число операций ввода-вывода, необходимое для выполнения любой заданной BMMC-перестановки, исключительно как функцию от соответствующей матрицы A, а дакже дают оптимальный алгоритм ее реализации.
Транспонирование матриц является частным случаем более общего класса перестановок, называемых перестановками типа «''перестановка битов и дополнение''» (bit-permute/complement, BPC), которые, в свою очередь, являются подмножеством класса перестановок типа «''перемножение битовых матриц и дополнение''» (bit-matrix-multiply/complement, BMMC). BMMC-перестановки определяются неособенной матрицей A размера log N x log N, содержащей только нули и единицы, и вектором длины log N с такими же элементами. Элемент с двоичным адресом <math>x</math> отображается перестановкой на двоичный адрес, заданный <math>Ax \oplus c</math>, где <math>\oplus</math> обозначает поразрядное исключающее «ИЛИ». BPC-перестановки являются частным случаем BMMC-перестановок, в котором A является матрицей перестановок, то есть каждая строка и каждый столбец A содержат по одному значению 1. В число BPC-перестановок входят транспонирование матрицы, бит-реверсивная перестановка (которая возникает при быстром преобразовании Фурье), обращение векторов, перестановка элементов гиперкуба и переблокировка матрицы. Кормен и коллеги [6] характеризуют оптимальное число операций ввода-вывода, необходимое для выполнения любой заданной BMMC-перестановки, исключительно как функцию от соответствующей матрицы A, а также дают оптимальный алгоритм ее реализации.




Теорема 4 [6]. При наличии D дисков количество операций ввода-вывода, необходимых для выполнения BMMC-перестановки, заданной матрицей A и вектором c, равно  
'''Теорема 4 [6]. При наличии D дисков количество операций ввода-вывода, необходимых для выполнения BMMC-перестановки, заданной матрицей A и вектором c, равно'''


где у – подматрица размером log n x log B матрицы A, расположенная в ее левом нижнем углу.
(5) <math>\Theta \bigg( \frac{n}{D} \bigg( 1 + \frac{rank( \gamma )}{log \; m} \bigg) \bigg) ,</math> '''где <math>\gamma</math> – подматрица размером <math>log \; n \times log \; B</math> матрицы A, расположенная в ее левом нижнем углу.'''




Двумя основными парадигмами внешней сортировки являются распределение и слияние, которые будут рассмотрены далее для модели PDM.
Двумя основными парадигмами внешней сортировки являются ''распределение'' и ''слияние'', которые будут рассмотрены далее для модели PDM.




'''Сортировка распределением'''
'''Сортировка распределением'''


Сортировка распределением [ ] представляет собой рекурсивный процесс, который использует набор из S - 1 элементов разбиения для распределения элементов на S несовпадающих «корзин». Все элементы в одной корзине предшествуют всем элементам в следующей корзине. Сортировка завершается рекурсивной сортировкой отдельных корзин и объединением их в единый, полностью отсортированный список.
''Сортировка распределением'' [9] представляет собой рекурсивный процесс, который использует набор из S - 1 элементов разбиения для распределения элементов на S несовпадающих «корзин». Все элементы в одной корзине предшествуют всем элементам в следующей корзине. Сортировка завершается рекурсивной сортировкой отдельных корзин и объединением их в единый, полностью отсортированный список.




Одним из требований является выбор S - 1 элементов разбиения таким образом, чтобы корзины были примерно одинакового размера. В этом случае размеры корзин уменьшаются от одного уровня рекурсии к другому на относительный коэффициент 0{S), и, таким образом, существует O(logS n) уровней рекурсии. На каждом уровне рекурсии выполняется сканирование данных. По мере прохождения элементов через внутреннюю память они разбиваются на S корзин в онлайновом режиме. Когда буфер размером B заполняется для одной из корзин, его блок записывается на диски при следующем вводе-выводе, и другой буфер используется для хранения следующего набора входящих элементов для этой корзины. Таким образом, максимальное число корзин (и элементов разбиения) равно S = 0{MIB) = 0{m), а результирующее число уровней рекурсии равно @(logm n). Как выполнить каждый уровень рекурсии за линейное число операций ввода-вывода, обсуждается в [2,11,16].
Одним из требований является выбор S - 1 элементов разбиения таким образом, чтобы корзины были примерно одинакового размера. В этом случае размеры корзин уменьшаются от одного уровня рекурсии к другому на относительный коэффициент <math>\Theta(S)</math>, и, таким образом, существует <math>O(log_S \; n)</math> уровней рекурсии. На каждом уровне рекурсии выполняется сканирование данных. По мере прохождения элементов через внутреннюю память они разбиваются на S корзин в онлайновом режиме. Когда буфер размером B заполняется для одной из корзин, его блок записывается на диски при следующем вводе-выводе, и для хранения следующего набора входящих элементов, предназначенных для этой корзины, используется другой буфер. Таким образом, максимальное число корзин (и элементов разбиения) равно <math>S = \Theta(M/B) = \Theta(m)</math>, а результирующее число уровней рекурсии равно <math>\Theta(log_m \; n)</math>. Как выполнить каждый уровень рекурсии за линейное число операций ввода-вывода, обсуждается в [2,11,16].




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




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




Строка 92: Строка 97:




В этом новом сценарии основной цикл алгоритма сортировки распределением, как и раньше, заключается в чтении одного блока памяти за раз и разбиении элементов на S корзин. Однако, в отличие от предыдущего варианта, блоки для каждого отдельной корзины будут располагаться на дисках в смежных полосах. Поэтому у каждого блока есть заранее определенное место, куда он должен быть записан. При обычном циклическом упорядочивании полос (например, ... , 1, 2, 3, ... , D, 1, 2, 3, ... , D, ... ) блоки из разных корзин могут «столкнуться» в том смысле, что их нужно будет записать на один и тот же диск, и последующие блоки в тех же корзинах также будут сталкиваться. Виттеру и Хатчинсону [15] удалось разрешить эту проблему с помощью техники рандомизированного зацикливания. Для каждой из S корзин они определяют порядок дисков в полосе для этой корзины с помощью случайной перестановки f1; 2.... , Dg. S случайных перестановок выбираются независимым образом. Если два блока (из разных корзин) случайно сталкиваются во время записи на один и тот же диск, то один блок записывается на диск, а другой остается в очереди на запись. С высокой вероятностью последующие блоки из этих двух корзин будут записаны на разные диски и, таким образом, не столкнутся. Для случая, когда существует небольшой запас доступного буферного пространства для временного кэширования блоков в очередях на запись, Виттер и Хатчинсон [15] показывают, что с высокой вероятностью запись происходит оптимально.
В этом новом сценарии основной цикл алгоритма сортировки распределением, как и раньше, заключается в чтении одного блока памяти за раз и разбиении элементов на S корзин. Однако, в отличие от предыдущего варианта, блоки для каждой отдельной корзины будут располагаться на дисках в смежных полосах. Поэтому у каждого блока есть заранее определенное место, куда он должен быть записан. При обычном циклическом упорядочивании полос (например, ... , 1, 2, 3, ... , D, 1, 2, 3, ... , D, ... ) блоки из разных корзин могут «столкнуться» в том смысле, что их нужно будет записать на один и тот же диск, и последующие блоки в тех же корзинах также будут сталкиваться. Виттеру и Хатчинсону [15] удалось разрешить эту проблему с помощью техники ''рандомизированного зацикливания''. Для каждой из S корзин они определяют порядок дисков в полосе для этой корзины с помощью случайной перестановки {1, 2, .... , D}. S случайных перестановок выбираются независимым образом. Если два блока (из разных корзин) случайно сталкиваются во время записи на один и тот же диск, то один блок записывается на диск, а другой остается в очереди на запись. С высокой вероятностью последующие блоки из этих двух корзин будут записаны на разные диски и, таким образом, не столкнутся. Для случая, когда существует небольшой запас доступного буферного пространства для временного кэширования блоков в очередях на запись, Виттер и Хатчинсон [15] показывают, что с высокой вероятностью запись происходит оптимально.




Строка 100: Строка 105:
'''Сортировка слиянием'''
'''Сортировка слиянием'''


Парадигма слияния в некотором смысле ортогональна парадигме распределения из предыдущего раздела. Типичный алгоритм сортировки слиянием работает следующим образом [ ]: на этапе «формирования прогонов» сканируется n блоков данных, по одной загрузке в память за раз; каждая загрузка в память сортируется в один «прогон», который затем выводится на серию полос на дисках. По завершении этапа формирования прогонов имеется N/M = n/m (отсортированных) прогонов, каждый из которых разбит на полосы на дисках. (При реализации алгоритма на практике можно использовать выбор с замещением для получения прогонов из 2M элементов данных в среднем при M "S [9]). После того, как начальные прогоны сформированы, начинается этап слияния. При каждом проходе фазы слияния за один раз объединяется R прогонов. Для каждого слияния R прогонов сканируются, и их элементы объединяются в онлайновом режиме по мере их прохождения через внутреннюю память. Для перекрытия операций ввода-вывода и вычислений используется двойная буферизация. За один раз может быть объединено не более R = 0{m) прогонов, а итоговое число проходов составляет O(logm n).
Парадигма ''слияния'' в некотором смысле ортогональна парадигме распределения из предыдущего раздела. Типичный алгоритм сортировки слиянием работает следующим образом [9]: на этапе «формирования прогонов» сканируется n блоков данных, по одной загрузке в память за раз; каждая загрузка в память сортируется в один «прогон», который затем выводится на серию полос на дисках. По завершении этапа формирования прогонов имеется N/M = n/m (отсортированных) прогонов, каждый из которых разбит на полосы на дисках. (При реализации алгоритма на практике можно использовать выбор с замещением для получения прогонов из 2M элементов данных в среднем при M >> B [9]). После того, как начальные прогоны сформированы, начинается этап слияния. При каждом проходе фазы слияния за один раз объединяется R прогонов. Для каждого слияния R прогонов сканируются, и их элементы объединяются в онлайновом режиме по мере их прохождения через внутреннюю память. Для перекрытия операций ввода-вывода и вычислений используется двойная буферизация. За один раз может быть объединено не более <math>R = \Theta(m)</math> прогонов, а итоговое число проходов составляет <math>O(log_m \; n)</math>.
 
 
Для достижения оптимальной границы сортировки (2) каждый проход слияния должен выполняться за O(n/D) операций ввода-вывода, что легко сделать для случая с использованием одного диска. В более общем случае с несколькими дисками каждая операция параллельного чтения во время процесса слияния должна в среднем выдать следующие <math>\Theta(D)</math> блоков, необходимых для слияния. Задача состоит в том, чтобы обеспечить размещение этих блоков на разных дисках так, чтобы они могли быть прочитаны за одну операцию ввода-вывода (или небольшое постоянное число таких операций). Сложность же заключается в том, что подлежащие слиянию прогоны были сформированы во время предыдущего прохода слияния. Их блоки были записаны на диски в предыдущем проходе без знания того, как они будут взаимодействовать с другими прогонами в последующих слияниях.
 


Метод жадной сортировки (Greed Sort) Нодина и Виттера [12] был первым оптимальным детерминированным EM-алгоритмом для сортировки с использованием нескольких дисков. Он работает путем ослабления процесса слияния с последним проходом для фиксации слияния. Аггарвал и Плакстон [1] разработали оптимальный детерминированный метод сортировки слиянием на основе алгоритма параллельной сортировки гиперкуба Sharesort. Чтобы гарантировать равномерное распределение во время слияния, они используют две высокоуровневые схемы слияния, в которых планирование почти не учитывается. Как и Greed Sort, алгоритм Sharesort теоретически оптимален (т. е. отличается от оптимального не более чем на константный коэффициент), но этот константный коэффициент больше, чем у методов сортировки распределением.


Для достижения оптимальной границы сортировки (2) каждый проход слияния должен выполняться за O(n/D) операций ввода-вывода, что легко сделать для случая с использованием одного диска. В более общем случае с несколькими дисками каждая операция параллельного чтения во время процесса слияния должна в среднем выдать следующие 0{D) блоков, необходимых для слияния. Задача состоит в том, чтобы обеспечить размещение этих блоков на разных дисках так, чтобы они могли быть прочитаны за одну операцию ввода-вывода (или небольшое постоянное число таких операций). Сложность же заключается в том, что подлежащие слиянию прогоны были сформированы во время предыдущего прохода слияния. Их блоки были записаны на диски в предыдущем проходе без знания того, как они будут взаимодействовать с другими прогонами в последующих слияниях.


Один из наиболее практичных методов сортировки основан на алгоритме ''простой рандомизированной сортировки слиянием'' (SRM) Барве и коллег [5], который Кнут назвал [9] «рандомизированным чередованием». Каждый прогон чередуется полосами по дискам, но со случайной начальной точки (это единственное место в алгоритме, где используется случайность). В процессе слияния следующий требуемый блок с каждого диска считывается в память, а если места недостаточно, то наименее нужные блоки «сбрасываются» (без применения каких-либо операций ввода-вывода), чтобы освободить место.


Метод жадной сортировки (Greed Sort) Нодина и Виттера [12] был первым оптимальным детерминированным EM-алгоритмом для сортировки с использованием нескольких дисков. Он работает путем ослабления процесса слияния с последним проходом для фиксации слияния. Аггарвал и Плакстон [ ] разработали оптимальный детерминированный метод сортировки слиянием на основе алгоритма параллельной сортировки гиперкуба Sharesort. Чтобы гарантировать равномерное распределение во время слияния, они используют две высокоуровневые схемы слияния, в которых планирование почти не учитывается. Как и Greed Sort, алгоритм Sharesort теоретически оптимален (т. е. отличается от оптимального не более чем на константный коэффициент), но этот константный коэффициент больше, чем у методов сортировки распределением.
Один из наиболее практичных методов сортировки основан на простом алгоритме рандомизированной сортировки слиянием (SRM) Барве и коллег [5], который Кнут назвал [9] «рандомизированным чередованием». Каждый прогон чередуется полосами по дискам, но со случайной начальной точки (это единственное место в алгоритме, где используется случайность). В процессе слияния следующий требуемый блок с каждого диска считывается в память, а если места недостаточно, то наименее нужные блоки «сбрасываются» (без применения каких-либо операций ввода-вывода), чтобы освободить место.


Для дальнейшего улучшения эффективности сортировки слиянием требуется более тщательное составление расписания предварительной выборки для прогонов. Барве и др. [4], Каллахалла и Варман [8], Шах и коллеги [13], а также другие исследователи разработали конкурентоспособные и оптимальные методы предварительной выборки блоков в параллельных системах ввода-вывода. Хатчинсон и др. [7] продемонстрировали мощную двойственность между параллельной записью и параллельной предварительной выборкой, которая дает простой способ вычисления оптимальных расписаний предварительной выборки и кэширования при использовании нескольких дисков. Более того, они показали, что такая же двойственность существует между распределением и слиянием, а также использовали это открытие для получения доказательно оптимальной и очень практичной сортировки слиянием с использованием параллельных дисков. Вместо того, чтобы использовать случайные начальные точки и циклическое упорядочивание полос, как в алгоритме SRM, Хатчинсон и др. [7] упорядочивают полосы независимо для каждого прогона, основываясь на стратегии случайного зацикливания, рассмотренной в разделе «Сортировка распределением».


Для дальнейшего улучшения эффективности сортировки слиянием требуется более тщательное составление расписания предварительной выборки для прогонов. Барве и др. [ ], Каллахалла и Варман [8], Шах и коллеги [13], а также другие исследователи разработали конкурентоспособные и оптимальные методы предварительной выборки блоков в параллельных системах ввода-вывода. Хатчинсон и др. [7] продемонстрировали мощную двойственность между параллельной записью и параллельной предварительной выборкой, которая дает простой способ вычисления оптимальных расписаний предварительной выборки и кэширования при использовании нескольких дисков. Более того, они показали, что такая же двойственность существует между распределением и слиянием, а также использовали это открытие для получения доказательно оптимальной и очень практичной сортировки слиянием с использованием параллельных дисков. Вместо того, чтобы использовать случайные начальные точки и циклическое упорядочивание полос, как в алгоритме SRM, Хатчинсон и др. [ ] упорядочивают полосы независимо для каждого прогона, основываясь на стратегии случайного зацикливания, рассмотренной в разделе «Сортировка распределением».




'''Обработка дубликатов: пакетная сортировка'''
'''Обработка дубликатов: пакетная сортировка'''


Для удаления дубликатов, когда среди N элементов имеется в общей сложности K различных элементов, Арге и др. [3] используют модификацию сортировки слиянием для решения этой задачи за 0(nmax{l,logm(.Kyfi)}) операций ввода-вывода, что является оптимальным в модели сравнения [3]. Когда во время слияния дубликаты группируются вместе, они заменяются единственной копией элемента и подсчетом числа его вхождений. Этот алгоритм можно использовать для сортировки файла, предполагая, что группа одинаковых элементов может быть представлена одним элементом и подсчитанным числом появлений.
Для ''удаления дубликатов'', когда среди N элементов имеется в общей сложности K различных элементов, Арге и др. [3] используют модификацию сортировки слиянием для решения этой задачи за <math>O(n \; max \{ 1,log_m (K/B) \} )</math> операций ввода-вывода, что является оптимальным в модели сравнения [3]. Когда во время слияния дубликаты группируются вместе, они заменяются единственной копией элемента и подсчетом числа его вхождений. Этот алгоритм можно использовать для сортировки файла, предполагая, что группа одинаковых элементов может быть представлена одним элементом и подсчитанным числом появлений.




Более сложный случай сортировки, называемый пакетной сортировкой, имеет место, когда среди N элементов есть K различных ключевых значений, но все элементы содержат различную вторичную информацию, которая должна сохраняться, и поэтому не могут быть объединены с помощью подсчета. Матиас и др. разработали оптимальные алгоритмы сортировки распределением для пакетной сортировки, используя
Более сложный случай сортировки, называемый ''пакетной сортировкой'', имеет место, когда среди N элементов есть K различных ключевых значений, но все элементы содержат различную вторичную информацию, которая должна сохраняться, и поэтому не могут быть объединены с помощью подсчета. Матиас и др. [10] разработали оптимальные алгоритмы сортировки распределением для пакетной сортировки, используя


(6)
(6) <math>O(n \; max \{ 1,log_m \; min \{ K, n \} \} )</math>


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




'''Перестановка и транспонирование'''
'''Перестановка и транспонирование'''


Перестановка представляет собой это частный случай сортировки, в котором ключевые значения N элементов данных образуют перестановку f1; 2... , Ng. Граница ввода-вывода (3) для перестановки может быть реализована одним из оптимальных алгоритмов сортировки, за исключением крайнего случая B log m = o (log n), когда быстрее переместить элементы данных по одному неблокирующим способом. Метод перемещения элементов по одному тривиален, если D = 1, но при использовании нескольких дисков могут возникать узкие места на отдельных дисках; одним из решений для выполнения перестановки за O(N/D) операций ввода-вывода является применение рандомизированных стратегий балансировки из работы [16].
Перестановка представляет собой частный случай сортировки, в котором ключевые значения N элементов данных образуют перестановку {1, 2, ... , N}. Граница ввода-вывода (3) для перестановки может быть реализована одним из оптимальных алгоритмов сортировки, за исключением крайнего случая B log m = o (log n), когда быстрее переместить элементы данных по одному неблокирующим способом. Метод перемещения элементов по одному тривиален, если D = 1, но при использовании нескольких дисков могут возникать узкие места на отдельных дисках; одним из решений для выполнения перестановки за O(N/D) операций ввода-вывода является применение рандомизированных стратегий балансировки из работы [16].




Транспонирование матрицы может быть таким же трудным, как и перестановка общего вида, когда B относительно велико (скажем, 1/2M) и N составляет O(M2); однако при меньших значениях B специальная структура перестановки упрощает процесс транспонирования. В частности, матрица может быть разбита на квадратные подматрицы из B2 элементов так, чтобы каждая подматрица содержала B блоков матрицы в порядке возрастания строк, а также B блоков матрицы в порядке возрастания столбцов. Таким образом, если B2 < M, транспонирование может быть произведено простой однопроходной операцией путем транспонирования по одной подматрице во внутренней памяти.
Транспонирование матрицы может быть таким же трудным, как и перестановка общего вида, когда B относительно велико (скажем, 1/2M) и N составляет <math>O(M^2)</math>; однако при меньших значениях B специальная структура перестановки упрощает процесс транспонирования. В частности, матрица может быть разбита на квадратные подматрицы из <math>B^2</math> элементов так, чтобы каждая подматрица содержала B блоков матрицы в порядке возрастания строк, а также B блоков матрицы в порядке возрастания столбцов. Таким образом, если <math>B^2 < M</math>, транспонирование может быть произведено простой однопроходной операцией путем транспонирования по одной подматрице во внутренней памяти.




Строка 143: Строка 151:
'''Нижние границы для операций ввода-вывода'''
'''Нижние границы для операций ввода-вывода'''


Следующее доказательство нижней границы перестановки (3) теоремы 2 принадлежит Аггарвалу и Виттеру [ ]. Идея доказательства состоит в том, чтобы для каждого t > 0 вычислить число различных упорядочений, которые реализуются последовательностями из t операций ввода-вывода. Значение t, при котором число различных упорядочений впервые превышает N!/2, является нижней границей среднего числа операций ввода-вывода (и, следовательно, числа таких операций в наихудшем случае), необходимых для выполнения перестановки.
Следующее доказательство нижней границы перестановки (3) теоремы 2 принадлежит Аггарвалу и Виттеру [2]. Идея доказательства состоит в том, чтобы для каждого <math>t \ge 0</math> вычислить число различных упорядочений, которые реализуются последовательностями из t операций ввода-вывода. Значение t, при котором число различных упорядочений впервые превышает N!/2, является нижней границей среднего числа операций ввода-вывода (и, следовательно, числа таких операций в наихудшем случае), необходимых для выполнения перестановки.




Предположив на данный момент, что имеется только один диск, D = 1, рассмотрим, как может измениться количество реализуемых упорядочений в результате ввода-вывода. С точки зрения увеличения числа реализуемых упорядочений, эффект от чтения дискового блока значительно больше, чем от его записи, поэтому достаточно рассмотреть только эффект от операций чтения. Во время операции чтения в блоке чтения имеется не более B элементов данных, и они могут быть размещены среди М элементов во внутренней памяти не более чем (B) способами, поэтому число реализуемых упорядочений увеличивается в (^) раз. Если блок никогда ранее не находился во внутренней памяти, то число реализуемых упорядочений увеличивается на дополнительный коэффициент В!, поскольку элементы в блоке могут быть переставлены между собой. (Этот дополнительный вклад B! может иметь место только один раз для каждого из N/B исходных блоков). Существует не более n + t < NlogN способов выбрать, какой дисковый блок участвует в t-й операции ввода-вывода (при произвольном объеме дискового пространства). Следовательно, число различных упорядочений, которые могут быть реализованы всеми возможными последовательностями t операций ввода-вывода, не превышает
Предположив на данный момент, что имеется только один диск, D = 1, рассмотрим, как может измениться количество реализуемых упорядочений в результате ввода-вывода. С точки зрения увеличения числа реализуемых упорядочений, эффект от чтения дискового блока значительно больше, чем от его записи, поэтому достаточно рассмотреть только эффект от операций чтения. Во время операции чтения в блоке чтения имеется не более B элементов данных, и они могут быть размещены среди М элементов во внутренней памяти не более чем <math>\binom{M}{B}</math> способами, поэтому число реализуемых упорядочений увеличивается в <math>\binom{M}{B}</math> раз. Если блок никогда ранее не находился во внутренней памяти, то число реализуемых упорядочений увеличивается на дополнительный коэффициент В!, поскольку элементы в блоке могут быть переставлены между собой. (Этот дополнительный вклад B! может иметь место только один раз для каждого из N/B исходных блоков). Существует не более <math>n + t \le N \; log \; N</math> способов выбрать, какой дисковый блок участвует в t-й операции ввода-вывода (при произвольном объеме дискового пространства). Следовательно, число различных упорядочений, которые могут быть реализованы всеми возможными последовательностями t операций ввода-вывода, не превышает


(7)
(7) <math>(B!)^{N/B} \bigg( N (log \; N) \binom{M}{B} \bigg)^t.</math>




Положив, что выражение в (7) не меньше N!/2, и упростив его за счет взятия логарифма, получаем результат
Положив, что выражение в (7) не меньше N!/2, и упростив его за счет взятия логарифма, получаем результат


(8) <math> N \; log \; B + t \bigg( log \; N + B \; log \frac{M}{B} \bigg) = \Omega (N \; log \; N).</math>


Решение для t дает подходящую нижнюю границу Q(n\ogm n) перестановки для случая D = 1. Общая нижняя граница (3) теоремы 2 получается в результате деления на D.
Решение для t дает подходящую нижнюю границу <math>\Omega(n \; log_m \; n)</math> перестановки для случая D = 1. Общая нижняя граница (3) теоремы 2 получается в результате деления на D.




Более сильную нижнюю границу можно получить в результате более тонкого рассуждения, которое считает входные операции отдельно от выходных [ ]. Для типичного случая, когда В log m = !(logN), нижняя граница ввода-вывода, вплоть до членов низшего порядка, равна 2nlogm n. Для патологического случая, когда В log m = o(logN), нижняя граница ввода-вывода, вплоть до членов низшего порядка, равна N/D.
Более сильную нижнюю границу можно получить в результате более тонкого рассуждения, которое считает входные операции отдельно от выходных [7]. Для типичного случая, когда <math>В \; log \; m = \omega (log \; N)</math>, нижняя граница ввода-вывода, вплоть до членов низшего порядка, равна <math>2n \; log_m \; n</math>. Для патологического случая, когда <math>В \; log \; m = o(log \; N)</math>, нижняя граница ввода-вывода, вплоть до членов низшего порядка, равна N/D.




Поскольку перестановка – это частный случай сортировки, то, следовательно, нижняя граница перестановки применима и к сортировке. В маловероятном случае, когда B log m = o(log n), нижняя граница перестановки составляет только £2 (N/D), и в этом случае для получения полной нижней границы (2) теоремы 1 [2] необходимо использовать модель сравнения. В типичном случае, когда B log m = J2(log n), модель сравнения для доказательства нижней границы сортировки не нужна; сложность сортировки в этом случае возникает не из-за определения порядка данных, а из-за перестановки (или маршрутизации) данных.
Поскольку перестановка – это частный случай сортировки, то, следовательно, нижняя граница перестановки применима и к сортировке. В маловероятном случае, когда <math>В \; log \; m = o(log \; n)</math>, нижняя граница перестановки составляет только <math>\Omega(N/D)</math>, и в этом случае для получения полной нижней границы (2) теоремы 1 [2] необходимо использовать модель сравнения. В типичном случае, когда <math>В \; log \; m = \Omega (log \; N)</math>, модель сравнения для доказательства нижней границы сортировки не нужна; сложность сортировки в этом случае возникает не из-за определения порядка данных, а из-за перестановки (или маршрутизации) данных.




Доказательство, использованное выше для перестановок, работает и для перестановочных сетей, в которых схема коммуникаций абстрактна (фиксирована). Поскольку выбор дискового блока фиксирован для каждого t, то здесь нет члена NlogN, как в (7), и, соответственно, нет аддитивного члена log N во внутреннем выражении, как в (8). Следовательно, решение для t дает нижнюю границу (2), а не (3). Нижняя граница следует непосредственно из рассуждения о подсчете; в отличие от вывода сортировки, она не требует модели сравнения для случая B log m = o(log n). Эта нижняя граница также непосредственно применима к БПФ, поскольку сети перестановок могут быть образованы из трех последовательных БПФ. Нижняя граница для транспонирования включает потенциальный аргумент, основанный на отношении совместности [2].
Доказательство, использованное выше для перестановок, работает и для перестановочных сетей, в которых схема коммуникаций абстрактна (фиксирована). Поскольку выбор дискового блока фиксирован для каждого t, то здесь нет члена N log N, как в (7), и, соответственно, нет аддитивного члена log N во внутреннем выражении, как в (8). Следовательно, решение для t дает нижнюю границу (2), а не (3). Нижняя граница следует непосредственно из рассуждения о подсчете; в отличие от вывода сортировки, она не требует модели сравнения для случая <math>В \; log \; m = o(log \; n)</math>. Эта нижняя граница также непосредственно применима к БПФ, поскольку сети перестановок могут быть образованы из трех последовательных БПФ. Нижняя граница для транспонирования включает потенциальный аргумент, основанный на отношении совместности [2].




Для задачи сортировки пакетной, в которой N элементов имеют в общей сложности K различных ключевых значений (но вторичная информация каждого элемента отлична от других), Матиас и др. [10] вывели соответствующую нижнюю границу.
Для задачи пакетной сортировки, в которой N элементов принимают в общей сложности K различных ключевых значений (но вторичная информация каждого элемента отлична от других), Матиас и др. [10] вывели соответствующую нижнюю границу.




Строка 172: Строка 181:


== Применение ==
== Применение ==
Сортировка и операции, подобные ей, составляют значительную долю компьютерных вычислений [ ], при этом они находят множество применений в базах данных. Кроме того, сортировка является важной парадигмой при разработке эффективных EM-алгоритмов, как показано в [14], где можно найти несколько приложений. С некоторыми техническими оговорками, многие проблемы, которые могут быть легко решены за линейное время во внутренней памяти, такие как перестановка, ранжирование списка, оценка дерева выражений и поиск связных компонентов в разреженном графе, требуют такого же количества операций ввода-вывода в PDM, как и сортировка.
Сортировка и операции, подобные ей, составляют значительную долю компьютерных вычислений [9], а также находят множество применений в базах данных. Кроме того, сортировка является важной парадигмой при разработке эффективных EM-алгоритмов, как показано в [14], где можно найти несколько приложений. С некоторыми техническими оговорками, многие задачи, которые могут быть легко решены за линейное время во внутренней памяти, такие как перестановка, ранжирование списка, оценка дерева выражений и поиск связных компонентов в разреженном графе, требуют такого же количества операций ввода-вывода в PDM, как и сортировка.


== Открытые вопросы ==
== Открытые вопросы ==
Несколько интересных задач остаются нерешенными. Одной из сложных теоретических проблем является доказательство нижних границ для перестановки и сортировки без предположения о неделимости. Другой вопрос заключается в том, как определить стоимость ввода-вывода для каждой отдельной перестановки как функцию некоторой простой характеристики перестановки, например, количества инверсий. Постоянной целью является разработка оптимальных EM-алгоритмов и перевод теоретических достижений в заметные улучшения в практическом применении. Любопытные проблемы и возможности в разработке и анализе алгоритмов возникают в связи с появлением новых архитектур, таких как сети рабочих станций, иерархические устройства хранения, дисковые накопители с возможностями обработки и устройства хранения на основе микроэлектромеханических систем (МЭМС). Недавно были предложены активные (или интеллектуальные) диски, в которых дисковые накопители имеют некоторые возможности обработки и могут фильтровать информацию, отправляемую на хост-компьютер, для «расширения» узкого места в виде операций ввода-вывода, особенно в масштабных приложениях баз данных. Энергонезависимая память на основе МЭМС может стать промежуточным уровнем в иерархии памяти между DRAM и дисками. В конечном итоге она может обеспечить лучшие по сравнению с дисками параметры задержки и пропускной способности при меньшей стоимости за бит, чем у DRAM.
Несколько интересных задач остаются нерешенными. Одной из сложных теоретических проблем является доказательство нижних границ для перестановки и сортировки без предположения о неделимости. Другой вопрос заключается в том, как определить стоимость ввода-вывода для каждой отдельной перестановки как функцию от некоторой простой характеристики перестановки например, от количества инверсий. Постоянной целью является разработка оптимальных EM-алгоритмов и перевод теоретических достижений в заметные улучшения в практическом применении. Любопытные проблемы и возможности в разработке и анализе алгоритмов возникают в связи с появлением новых архитектур, таких как сети рабочих станций, иерархические устройства хранения, дисковые накопители с возможностями обработки, устройства хранения на основе микроэлектромеханических систем (МЭМС). Недавно были представлены активные (или интеллектуальные) диски, в которых дисковые накопители имеют некоторые возможности обработки и могут фильтровать информацию, отправляемую на хост-компьютер, для «расширения» узкого места в виде операций ввода-вывода, особенно в масштабных приложениях баз данных. Энергонезависимая память на основе МЭМС может стать промежуточным уровнем в иерархии памяти между DRAM и дисками. В конечном итоге она может обеспечить лучшие по сравнению с дисками параметры задержки и пропускной способности при меньшей стоимости за бит, чем у DRAM.


== Ссылка на код ==
== Ссылка на код ==
4430

правок