- •2. Основные операции для работы с d-кучами
- •3. Лабораторные работы
- •3.1. Нахождение кратчайших путей в графе Постановка задачи
- •Структура данных для представления графа
- •Алгоритм Дейкстры, реализованный на основе d-кучи
- •Алгоритм Дейкстры, использующий метки
- •Алгоритм Форда–Беллмана
- •Задания для лабораторной работы № 1
- •3.2. Нахождение минимального остова графа Постановка задачи
- •Стратегии решения задачи
- •Алгоритм Борувки
- •Алгоритм Краскала
- •Алгоритм Прима
- •Round Robin алгоритм
- •Задания для лабораторной работы № 2
- •3.3. Создание и использование словаря Постановка задачи
- •Решение задачи создания и использования словаря
- •Тривиальный алгоритм
- •Алгоритм с использованием авл-дерева
- •Задания для лабораторной работы № 3
- •3.4. Поиск фрагмента в тексте Постановка задачи
- •Наивный алгоритм поиска фрагмента в тексте
- •Алгоритм Кнута-Морриса-Пратта
- •Задания для лабораторной работы № 4
- •3.5. Сортировка Постановка задачи
- •Сортировка с помощью d-кучи
- •Быстрая сортировка
- •Задания для лабораторной работы № 5
- •3.6. Построение выпуклой оболочки n точек на плоскости Постановка задачи
- •Построение выпуклой оболочки с помощью сортировки
- •Задания для лабораторной работы № 6
- •3.7. Поиск пары пересекающихся отрезков Постановка задачи
- •Наивный алгоритм поиска пересечения
- •Эффективный алгоритм поиска пересечения
- •Задания для лабораторной работы № 7
- •4. Приложение: генерация графов для экспериментов
- •Литература
Алгоритм Краскала
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 входит в построенный фрагмент минимального остова).
Алгоритм начинает свою работу с любой вершины uV. Для определенности положим, что 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 xOG(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 xOG(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;
foruVdobeginСоздать(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 ij 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(mlog log n).
Примечание. Элемент (ребро) в ленивой куче H[t] считается пустым, если концы этого ребра принадлежат одному и тому же множеству из коллекции K.
Задания для лабораторной работы № 2
Предлагается попарное сравнение различных алгоритмов нахождения минимального по весу остовного дерева в графе G = (V, E), имеющего n вершин и m ребер.
Варианты выбора пары алгоритмов A и B для сравнения:
Вариант 1
А алгоритм Борувки,
В алгоритм Краскала;
Вариант 2
А алгоритм Борувки,
В алгоритм Прима;
Вариант 3
А алгоритм Прима,
В алгоритм Краскала;
Вариант 4
А алгоритм Борувки,
В Round Robin алгоритм.
Задание.
Написать программу, реализующую алгоритм А и алгоритм В.
Написать программу, реализующую алгоритм А и алгоритм В, для проведения экспериментов, в которых можно выбирать:
число n вершин и число m ребер графа,
натуральные числа q и r, являющиеся соответственно нижней и верхней границей для весов ребер графа.
Выходом данной программы должно быть время работы ТА алгоритма А и время работы ТВ алгоритма В в секундах.
Провести эксперименты на основе следующих данных:
n = 1, … ,104+1 с шагом 100, q = 1, r =106, количество ребер: а) m ≈ n2/10, б) m ≈ n2 (нарисовать графики функций TА(n) и ТВ(n) для обоих случаев);
n = 101, … ,104+1 с шагом 100, q = 1, r = 106, количество ребер: а) m ≈ 100n, б) m ≈ 1000n (нарисовать графики функций TА(n) и ТВ(n) для обоих случаев);
n = 104+1, m = 0, … ,107 с шагом 105, q = 1, r = 106 (нарисовать графики функций TА(m) и ТВ(m) );
n = 104+1, q = 1, r = 1, … ,200 с шагом 1, количество ребер: а) m ≈ n2, б) m ≈ 1000n (нарисовать графики функций TА(r) и ТВ(r) для обоих случаев).
Сформулировать и обосновать вывод о том, в каких случаях целесообразно применять алгоритм А, а в каких алгоритм В.