Многопутевое слияние и выбор с замещением
Внешняя сортировка
Рассмотренные методы сортировки были рассчитаны на то, что таблица целиком помещается в оперативной памяти и в любой момент открыт доступ к любому элементу таблицы. Внешняя сортировка отличается тем, что время доступа к данным на внешних носителях чрезвычайно велико по сравнению с временем доступа к оперативной памяти.
Предположим, что нужно отсортировать таблицу из 5000
R1-R5000 записей, а в оперативную память помещается не более 1000 записей. Решение может быть следующим – начать с внутренней сортировки каждого из 5 отрезков по 1000 записей, а затем слить полученные сортированные отрезки. Такой процесс – внутренняя сортировка с последующим внешним слиянием – является основой многих методов внешней сортировки.
В качестве введения рассмотрим метод, который можно назвать сбалансированным двухпутевым слиянием. Метод использует 4 файла. В первой фазе упорядоченные отрезки, получаемые внутренней сортировкой, помещаются поочередно в файлы 1 и 2 до тех пор, пока не исчерпаются входные данные. Начальная фаза распределения отрезков размещает пять отрезков следующим образом:
Файл 1: R1 – R1000; R2001 – R3000; R4001 – R5000
Файл 2: R1001 – R2000; R3001 – R4000
Файл 3: пусто
Файл 4: пусто
Затем файлы 1 и 2 вновь позиционируем на начало и сливаем отрезки с этих файлов, получая отрезки вдвое более длинные, чем исходные. Эти отрезки попеременно записываются в файлы 3,4. Отрезок R4001 – R5000 в файле 1 не имеет пары для слияния в файле 2. Неявно добавим для создания такой пары в файл 2 фиктивный отрезок длины 0. После первого прохода слияния получим:
Файл 1: пусто
Файл 2: пусто
Файл 3: R1 – R2000; R4001 – R5000
Файл 4: R2001 – R4000
Применив тот же алгоритм к файлам 3,4, в файлах 1,2 получим результат:
Файл 1: R1 – R4000
Файл 2: R4001 – R5000
Наконец, после последнего прохода в файле 3 получим R1 – R5000, и сортировка завершена.
Аналогично можно рассмотреть 3-х и более – путевое слияние. Пусть для сортировки выделено N файлов. Разделим их на 2 части – в одной M файлов, в другой - N-M файлов. Распределим исходные отрезки по возможности более равномерно по M файлам первой части и выполним M-путевое слияние, помещая результат слияния поочередно в оставшиеся N-M файлов. Затем выполним N-M – путевое слияние, помещая результаты слияния в файлы первой части.
Рассмотрим процесс порождения начальных отрезков, которые затем подвергаются слиянию. Пусть имеется Р возрастающих отрезков. Очевидным способом их слияния является следующий: из первых ключей каждого отрезка выбрать минимальный, соответствующую запись передать на выход и исключить из входных данных, затем этот процесс повторяется. Если Р велико, то целесообразно использовать дерево выбора из Р элементов. Пример 4-х путевого слияния изображен на рис. 39.
![]() |
Рис.39 4х-путевое слияние
Техника выбора с замещением может использоваться на первой фазе внешней сортировки. В этом случае Р выбирается достаточно большим. Каждая запись при выводе замещается очередной записью из исходных данных. Если у новой записи ключ меньше, чем у только что выведенной, то она помечается как не участвующая в дальнейшем выборе, а значение Р уменьшается на единицу и процесс продолжается.
Пример. Пусть исходная последовательность ключей:
2 7 12 3 8 9 4 1 5 11 10 6 и Р=4
Процесс вывода начальных сортированных отрезков иллюстрируется таблицей:
Содержимое памяти | Вывод | |||
(4) | ||||
(4) | (1) | |||
(4) | (1) | (5) | ||
(4) | (1) | (11) | (5) | Конец отрезка |
… |
В скобки заключены ключи, не участвующие в дальнейшем выборе. Таким путем удается получить упорядоченные последовательности длиннее Р, что важно, так как время внешней сортировки слиянием в значительной мере зависит от числа начальных отрезков. Э.Ф.Мур предложил изящный способ доказательства того, что средняя длина порождаемого отрезка равна 2Р, проведя аналогию со снегоочистителем, движущимся по кругу. Пусть на кольцевую дорогу непрерывно падают снежинки (записи). Снежинки исчезают из системы (записи выводятся), когда они сбрасываются за пределы дороги. Точки дороги обозначаются вещественными числами x (0 £ x £1). Снежинка, падающая в точку х, соответствует входной записи с ключом х, а снегоочиститель имитирует процесс вывода. В установившемся режиме общее число снежинок на дороге в точности равно Р. Каждый раз, когда снегоочиститель проходит точку 0, заканчивается формирование нового отрезка. На рис.40 изображено поперечное сечение дороги, когда система находится в
![]() |
установившемся режиме.
Рис. 39 Аналогия со снегоочистителем
Из рисунка видно, что количество снега, удаляемого за один оборот, вдвое превосходит количество снега, присутствующего на дороге в любой момент.