Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы и структуры данных.doc
Скачиваний:
81
Добавлен:
01.05.2014
Размер:
411.14 Кб
Скачать

Алгоритм Краскала

procedureMSP_KRASKAL(varET;varmt;G;n,m);

begin

Отсортировать массив Eпо невозрастанию весов его элементов;

Создать коллекцию из n синглетонов множества {1, 2, … , n};

mt:= 0;

for i:= 1 to m do begin

Найти имя a подмножества, содержащего элементE[i][1];

Найти имя b подмножества, содержащего элемент E[i][2];

if a ≠ b then begin

Объединить подмножества коллекции с именами a и b;

mt:= mt+1; ET[mt]:= E[i];

end;

end;

end;

Временная сложность алгоритма Краскала есть O((m+n)log n)).

Алгоритм Прима

В данном алгоритме (см. [2]) используется представление исходного графа G окрестностями его вершин. Для окрестности i–ой вершины графа G = (V, E) мы будем использовать введенное обозначение OG(i). При этом заметим, что при непосредственном программировании следует использовать структуру ADJ[1..n]. В алгоритме используются также массивы

  • a[1..n] (a[x]  вес минимального по весу ребра, соединяющего вершину x с построенным фрагментом минимального остова),

  • b[1..n] (b[x]  имя второй вершины этого ребра) и

  • VT[1..n] (VT[y]=1, если вершина y входит в построенный фрагмент минимального остова).

Алгоритм начинает свою работу с любой вершины uV. Для определенности положим, что u является первой вершиной.

procedure MSP_PRIM(var ET; var mt; G; n,m);

begin

for i:= 1 to n do VT[i]:= 0; mt:= 0; u=1; VT[u]:= 1;

for xOG(u) do begin

a[x]:= W(x,u); b[x]:= u;

end else a[x]:= +;

while mt<n-1 do begin

u:= argmin{a[x] : VT[x]:= 0};

if a[u]:= + then begin writeln(‘граф несвязен’); exit; end;

q:= b[u];

VT[u]:= 1; mt:= mt+1;

ET[mt][1]:= u; ET[mt][2]:= q;

for xOG(u) do if VT[x]=0 then if a[x]>W(x,u) then begin

a[x]:= W(x,u); b[x]:= u;

end;

end;

end;

Временная сложность алгоритма Прима есть O(n2).

Примечание. Используемый в псевдокоде знак + обозначает число, которое больше веса любого ребра исходного графа G.

Round Robin алгоритм

procedure MSP_RRA(var ET; var mt; G; n,m);

begin

mt:= 0;

Создать пустую коллекцию Kразделенных подмножеств множестваV;

Создать пустой двусторонний список Qкорневых элементов разделенных множеств изK;

foruVdobeginСоздать(u, K); Добавитьuк концу спискаQ;

Создать ленивую левостороннюю кучу H(u) из ребер, инцидентныхu;

end;

while |Q|>1 do begin

Изъять первый элементfиз спискаQ;

Найти элемент edgeминимального веса в кучеH(f);

a:= edge[1]; b:= edge[2]; Найти(i,a,K); Найти(j,b,K);

if ij then begin

mt:= mt+1; ET[mt]:= edge;

Удалитьiиjиз спискаQ;

Объединить(i,j,K);

z:= корневой элемент подмножества, полученного объединением подмножеств с корневыми элементами и

i и j;

H(z):= ленивая левосторонняя куча, полученная слиянием кучH[i] иH[j];

Добавить zк концу спискаQ;

end;

end;

end;

Временная сложность Round Robin алгоритма есть O(mlog log n).

Примечание. Элемент (ребро) в ленивой куче H[t] считается пустым, если концы этого ребра принадлежат одному и тому же множеству из коллекции K.

Задания для лабораторной работы № 2

Предлагается попарное сравнение различных алгоритмов нахождения минимального по весу остовного дерева в графе G = (V, E), имеющего n вершин и m ребер.

Варианты выбора пары алгоритмов A и B для сравнения:

Вариант 1

  • А  алгоритм Борувки,

  • В  алгоритм Краскала;

Вариант 2

  • А  алгоритм Борувки,

  • В  алгоритм Прима;

Вариант 3

  • А  алгоритм Прима,

  • В  алгоритм Краскала;

Вариант 4

  • А  алгоритм Борувки,

  • В  Round Robin алгоритм.

Задание.

  1. Написать программу, реализующую алгоритм А и алгоритм В.

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

  • число n вершин и число m ребер графа,

  • натуральные числа q и r, являющиеся соответственно нижней и верхней границей для весов ребер графа.

Выходом данной программы должно быть время работы ТА алгоритма А и время работы ТВ алгоритма В в секундах.

  1. Провести эксперименты на основе следующих данных:

    1.  n = 1, … ,104+1 с шагом 100, q = 1, r =106, количество ребер: а) m ≈ n2/10, б) m ≈ n2 (нарисовать графики функций TА(n) и ТВ(n) для обоих случаев);

    2.  n = 101, … ,104+1 с шагом 100, q = 1, r  = 106, количество ребер: а) m ≈ 100n, б) m ≈ 1000n (нарисовать графики функций TА(n) и ТВ(n) для обоих случаев);

    3.  n = 104+1, m = 0, … ,107 с шагом 105, q = 1, r = 106 (нарисовать графики функций TА(m) и ТВ(m) );

    4.  n = 104+1, q = 1, r = 1, … ,200 с шагом 1, количество ребер: а) m ≈ n2, б) m ≈ 1000n (нарисовать графики функций TА(r) и ТВ(r) для обоих случаев).

  2. Сформулировать и обосновать вывод о том, в каких случаях целесообразно применять алгоритм А, а в каких  алгоритм В.