Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП_САОД_2003.doc
Скачиваний:
85
Добавлен:
25.11.2018
Размер:
3.26 Mб
Скачать
      1. Алгоритмы внешней сортировки

Как уже говорилось выше, внешняя сортировка – это упорядочивание данных, которые хранятся на внешнем устройстве с медленным доступом (диск, лента и т.д.) и, прежде всего надо уменьшить число обращений к этому устройству, то есть число проходов через файл.

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

Применение большинства алгоритмов внутренней сортировки для сортировки файлов требует порядка O(n) проходов. Однако, если несколько модифицировать алгоритм сортировки слиянием (см. п. 3.5.2.8), то можно произвести сортировку, осуществляя порядка O(log n) проходов.

Основное отличие сортировки слиянием для файлов, заключается в следующем. Вся сортируемая последовательность данных разбивается на два файла f1 и f2. Желательно, чтобы количество записей в этих файлах было поровну. Как и в алгоритме внутренней сортировки, считаем, что любой файл состоит из участков длиной 1. Затем можно объединить участки длины 1 и распределить их по файлам g1 и g2 в виде участков длины 2. После этого делаем f1 и f2 пустыми и объединяем g1 и g2 в f1 и f2, которые затем можно организовать в виде участков длины 4 и т.д.

После выполнения i подобного рода проходов, получатся два файла, состоящие из участков длины 2i. Если 2i  n, тогда один из этих двух файлов будет пустым, а другой будет содержать единственный участок длиной n, то есть будет отсортирован. Так как 2i  n при i  log n, то нетрудно заметить, что в этом случае будет достаточно порядка O(log n) проходов по данным.

Пример внешней сортировки слиянием приведен на рисунке ниже.

Рисунок 49. Внешняя сортировка слиянием

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

    1. Алгоритмы на графах

      1. Алгоритм определения циклов

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

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

Сформулируем алгоритм, используя матрицу смежности (см. п. 2.3.3.2):

var

M: TAdjacencyMatrix;

repeat

for i := 1 to n begin

if строка M(i ,*) = 0 then обнулить столбец M(*, i);

if столбец M(*, i) = 0 then обнулить строку M(i ,*);

end;

until M не изменилась;

if M нулевая then граф ациклический

else граф содержит циклы;

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

Рисунок 50. Определение циклов

В худшем случае этот алгоритм дает временную сложность Tmax(n), пропорциональную O(n3).