Многофазная сортировка слиянием - сколько фаз

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

  1. 4 ленты: 2 входные ленты, 2 выходные
  2. 3 ленты: 2 вп, 1 изн

Дело 1:

4 ленты

Мы начинаем с k прогонов, затем копируем эти прогоны на 2 входные ленты (слева на рис. ниже), на каждой итерации мы берем два разных прогона с входных лент, объединяем (и сортируем) их и за одну итерацию сохраняем на первую выходную ленту, а в следующей итерации - на вторую, как показано ниже. Затем меняем выходные ленты на входные и повторяем процедуру. Итак, если у нас есть, скажем, n=10^6 элементов и k=1000 прогонов, то после первой фазы размер прогона будет 2000, после третьего 4000 и так далее. Таким образом, общее количество фаз равно ceil(log_2(n)).

Случай 2:

3 ленты

В наилучшем случае сложности количество фаз равно position of Fibonacci’s number in the Fibonacci’s sequence minus two, т.е. если у нас начальное количество прогонов k=34 и 34 — 9-е число в последовательности Фибоначчи, то у нас будет 7 фаз.

введите здесь описание изображения

Но… если наше количество прогонов не является числом Фибоначчи, необходимо дополнить ленту фиктивными прогонами, чтобы получить «нет». пробегов до числа Фибоначчи.

Наконец, мой вопрос:

Какое среднее количество фаз необходимо для сортировки последовательности, если количество прогонов не является числом Фибоначчи?


person SantaXL    schedule 22.12.2017    source источник


Ответы (1)


Каково количество фаз... если количество прогонов не является числом Фибоначчи?

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


Некоторые примечания об информации в исходном вопросе:

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

Числа Фибоначчи применимы только к сценарию с 3 лентами. Для сценария с 4 или более лентами последовательность проще всего создать, начав с последней фазы и двигаясь в обратном направлении. Для 31 прогона на 4 лентах окончательное количество прогонов равно {1,0,0,0} в обратном порядке: {0,1,1,1}, {1,0,2,2}, {3,2, 0,4}, {7,6,4,0}, {0,13,11,7}.

Размеры серий увеличиваются в результате объединения предыдущих серий разных размеров. Предположим, что размер серии составляет 1 элемент, 31 серия, 4 ленты. После первоначального распространения количество запусков: размер запуска составляет {0:0,13:1,11:1,7:1}. Первая фаза: {7:3,6:1,4:1,0:0}. Вторая фаза: {3:3,2:1,0:0,4:5}. Третья фаза {1:3,0:0,2:9,2:5}. Четвертая фаза: {0:0,1:17,1:9,1:5}. Пятая и последняя фаза {1:31,0:0,0:0,0:0}.

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

В Wiki есть статья о многофазной сортировке слиянием.

https://en.wikipedia.org/wiki/Polyphase_merge_sort


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

Многофазная сортировка слиянием — это самый быстрый способ выполнить сортировку с использованием трех стеков.

person rcgldr    schedule 23.12.2017
comment
Метод с четырьмя лентами, описанный в моем вопросе, называется сбалансированной двухсторонней сортировкой слиянием, bluehawk.monmouth.edu/rclayton/web-pages/s06-503/esort.html - person SantaXL; 23.12.2017
comment
@SantaXL - я обновил свой ответ, чтобы отметить это. Я не был уверен, должен ли пример с 4 лентами показывать сбалансированную сортировку слиянием или многофазную сортировку слиянием. Многофазная сортировка слиянием выполняется быстрее для менее 8 лент, а сбалансированная сортировка слиянием выполняется быстрее для 8 и более лент. - person rcgldr; 23.12.2017