Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инф-госы теория и практика.doc
Скачиваний:
28
Добавлен:
29.08.2019
Размер:
3.77 Mб
Скачать

13. Алгоритмы внешней сортировки

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

Пример: 7 2 8 4 5 9 1 13 ← есть файл, можно отсортировать. Сводится к некоторым вариантам слияния.

Прямое слияние (сбалансированное):

Считаем, что данные состоят из серий длины 1. теперь имея ленты 3 и 4 начинаем сливать на них данные. Считаем, что ленты 1 и 2 пустые и сливаем III и IV.

Н а первом шаге d = 1 20

d = 2 21

… K

n 2k

Число проходов имеет порядок ~ logn

Суммарная длина = n => T ~ n logn

Алгоритмы слияния:

5 7 9 11 n = 4

1 3 4 5 8 m = 5

Сравниваем на первом шаге 2 первых элемента, меньший из них ставиться на первое место.

T ~ n+m (сравнений)

Вирт – естественное слияние (несбалансированное). Выделяем максимальные серии

СЛИВАЕМ

T ~ n logn

(но немного быстрее работает на 10-15%)

Далее началась изучаться и образовываться теория слияния:

-двух путевое слияние (данные распределены на любых шаге на 2 ленты)

- и т.д.

Также слияние может быть:

- сбалансированным (характеризует одинаковую длину серий на одной фазе слияния).

- несбалансированным (естественное слияние).

В несбалансированности скрывается улучшение слияния.

Многофазная (Фибоначиева) сортировка

Здесь фаз больше, но не все элементы просматриваем => фазы не все трудоемки.

Длины серий количество серий

1 1 5 3

2 1 3 2

3 2 2 1

5 3 1 1

0 1 1 2 3 5 8 13…

U0 U1 U2 U3 U4

Длины серий по прямому закону Фибоначчи количество серий по обратному закону Фибоначчи.

При n → ∞ приближается к геометрической прогрессии.

Существует

При n → ∞

По последовательности Фибоначчи:

{* }

2= +1

2- -1=0

D = 5

=>

золотое сечение

=> nn

14. Нахождение кратчайших путей в графе

Входные данные:

  • Граф G со взвешенными ребрами (подвесами можно понимать дли­ны ребер, если речь идет о геометрическом графе, или любые другие числовые характеристики ребер}. Пусть L(i,j) — вес ребра (i, j).

  • Стартовая вершина s (вершина, от которой вычисляются расстоя­ния до всех остальных вершин).

Выходные данные:

  • Массив dist[1...n], (dist[i] — кратчайшее расстояние от вершины s до вершины i).

  • Массив uр[1... n], (uр[i] — предпоследняя вершина в кратчайшем пути из вершины s в вершину i).

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

Алгоритм Дейкстры

  1. Заполнить массив up [1. ..n] нулями.

  1. Каждой вершине i приписать в качестве ключа dist[i] — максималь­но возможное число (оно должно быть больше, чем длина наиболь­шего из кратчайших путей в графе; в процессе вычислений это чис­ло будет уменьшаться и в итоге заменится на длину кратчайшего пу­ти из вершины s в вершину i).

  2. Организовать приоритетную очередь из вершин графа, взяв в каче­стве ключей величины dist[i], где i=1,2,…,n.

  1. Заменить ключ вершины s на 0.

  2. Пока очередь не пуста, выполнять операции 6,7.

  1. Выбрать (с удалением) из приоритетной очереди элемент r0 с мини­мальным ключом.

  1. Для каждой вершины r, смежной с r0, выполнить операции 8,9.

  1. Вычислить величину delta=dist[r] - (dist[r0 ]+ L(r0,r)).

  2. Если delta > 0, то уменьшить ключ dist[r] элемента r на величину delta и заменить старое значение величины up [r] на r0.

Алгоритм Дейкстры

Допустим, на некотором шаге описанного выше алгоритма построе­но дерево с множеством вершин А, а для каждой вершины у известна вершина х0 = F(y), на которой достигается наименьшее значение вели­чины , где минимум берется по всем верши­нам х А. Тогда на этом шаге следует выбрать вершит y с наимень­шим значением величины и присоединить к дереву ребро (F(y),y). После этого для каждой вершины z, еще не принадлежащей к дереву, зна­чения и F(z) уточняются следующим образом; если , то следует положить F(z)= . Вершина F(y) может рассматриваться как предполагаемый отец вершины у в геодези­ческом дереве (если все множество состояло бы из одной вершины у, то F(y) была бы ее истинным отцом). Величина (у) представляет собой оценку кратчайшего пути из a в у, она равна весу кратчайшего из путей, проходящих только через вершины множества А. После того, как верши­на у присоединяется к дереву, значения F(y) и (у) больше не изменяют­ся, F(y) является отцом вершины у в геодезическом дереве, а (у) = (у). В целом алгоритм можно представить следующим образом:

Алгоритм Дейкстры

ВХОД – С – матрица весов графа; s – вершина, называемая источником

ВЫХОД – D – массив, D[i] – расстояние от s до i.

L – массив, L[i] – направление оптимального пути от вершины i к s.

Алгоритм.

for i:=1 to n do D[i]:=C[s,i]; // первоначальное заполнение массива расстояний

for i:=1 to n do L[i]:=s;

D[s]:=0; // расстояние от вершины s до s-0

for i:=1 to n do lab [i]:=false; lab[s]:=true; // помечаем все вершины кроме s, как непросм.

for i:=1 to n-1 do begin // повторить n-1 раз (чтобы просмотреть все вершины, кроме s)

jmin:=1;

while lab[j] do begin // ищем непросмотренную вершину

j:=jmin;

while (j<=n) do begin // ищем ближайшую к s непросмотренную вершину

if (not lab[j]) and (D[j]<D[jmin]) then jmin:=j;

inc(j)

end;

lab[jmin]:=true; //помечаем ее

for j:=1 to n do if not lab[j] then begin // цикл по непросмотренным вершинам

if (D[jmin] +C[j,jmin])<D[j] then begin // проверяем можно ли сократить путь, пройдя через jmin

D[j]:=D[jmin]+ C[j,jmin]; // идем от j к s через вершину jmin

L[j]:=jmin // оптимальное направление от j к s – двигаться к jmin

end end end

1.

S=6 (источник) 1 2 3 4 5 6*

D – массив расстояния D 1 4 0

L – массив направления L 6 6 6 6 6 6

С[i,S] или C[S,i]

Ищем ближайшую к 6 по D непросмотренную: - 4

1 2 3 4* 5 6*

D 12 6 1 2 0

L 6 4 4 6 4 6

Ближ. непросм.: - 5 ближ. непросм.: - 3

1 2 3 4* 5* 6* 1 2 3* 4* 5* 6*

D 12 4 1 2 0 D 7 4 1 2 0

L 6 4 5 6 4 6 L 6 3 5 6 4 6

ближ. непросм.: - 2 ближ. непросм.: -1

1 2* 3* 4* 5* 6* 1* 2* 3* 4* 5* 6*

D 7 4 1 2 0 D 7 4 1 2 0

L 6 3 5 6 4 6 L 6 3 5 6 4 6