
- •Структуры и алгоритмы обработки данных
- •230100.62 – Информатика и вычислительная техника
- •Стандартная постановка задачи
- •Пример постановки задачи
- •Пример постановки задачи в стандартной форме
- •Алгоритмы и их сложность
- •Основы анализа программ
- •Пример анализа алгоритмов
- •Выполнение операторов программы
- •Основы доказательства корректности
- •Динамическое программирование
- •Перемножение нескольких матриц
- •Когда применимо динамическое программирование
- •Наибольшая общая подпоследовательность
- •Жадные алгоритмы
- •Задача о выборе заявок
- •Абстрактные типы данных
- •Атд «Список»
- •Атд «Стек»
- •Атд «Очередь»
- •Множества
- •Хеширование
- •Словари, основанные на хеш-таблицах
- •Поиск слова в тексте
- •Сортировка
- •Сортировка вставками
- •Корневая сортировка
- •Пирамидальная сортировка
- •Переформирование пирамиды
- •Построение пирамиды
- •Сортировка слиянием
- •Управление с помощью таблиц
- •Способы представления графа
- •Матрица смежности
- •Матрица инцидентности
- •Список рёбер
- •Алгоритмы обхода графа
- •Поиск в ширину
- •Задача о кратчайшем пути
- •Алгоритм Дейкстры
- •Алгоритм Беллмана-Форда
- •Задача перекресток
- •Максимальный поток
- •Метод Форда-Фалкерсона
- •Минимальные покрывающие деревья
- •Алгоритм Крускала
- •Алгоритм Прима
- •Минимальные покрывающие деревья
- •Поиск в глубину
- •Топологическая сортировка
- •Деревья
Алгоритм Крускала
В любой момент работы алгоритма Крускала множество A выбранных ребер (часть будущего остова) не содержит циклов. Оно соединяет вершины графа в несколько связных компонент, каждая из которых является деревом. Среди всех ребер, соединяющих вершины из разных компонент, берется ребро ниаменьшего веса. Надо проверить, что оно является безопасным.
Пусть (u,v) - такое ребро, соединяющее вершины из компонент C1 и C2. Это ребро является легким ребром для разреза (C1,V\ C1), и можно воспользоваться теоремой.
Алгоритм Крускала использует структуры данных для непересекающихся множеств. Элементами множеств являются вершины графа; каждое множество содержит вершины одной связной компоненты.
FIND-SET(u) - возвращает представителя множества, содержащего элемент u.
Процедура UNION выполняет объединение деревьев
MST-KRUSKAL(G,w)
1 A
2 for (для) каждой вершины vV[G]
3 do MAKE-SET(v)
4 упорядочить ребра E по весам
5for (для) (u,v) E (в порядке возрастания веса)
6 do if FIND-SET(u) FIND-SET(v)
7 then A A {(u,v)}
8 UNION (u,v)
9 return A
Оценка времени работы
Инициализация O(V)
Упорядочение ребер (строка 4) – O(E log E)
Далее производится O(E) операций, занимающих в совокупности O(E log E).
Общее время работы алгоритма Крускала O(E log E).
Алгоритм Прима
В алгоритме Прима растущая часть остова представляет собой дерево (множество ребер которого есть A). Формирование дерева начинается с произвольной корневой вершины r. На каждом шаге добавляется ребро наименьшего веса среди ребер, соединяющих веершины этого дерева с вершинами не из дерева. По следствию добавляемые ребра являются безопасными для A , так что в результате получается минимальный остов.
Алгоритм получает на вход связный граф G и корень r минимального покрывающего дерева. В ходе алгоритма все вершины, еще не попавшие в дерево, хранятся в очереди с приоритетами. Приоритет вершины v определяется значением key[v], которое равно минимальному весу ребер, соединяющих v с вершинами дерева A. (Если таких ребр нет, полагаем key[v] = ). Поле [v] для вершин дерева указывает на родителя, а для вершины v Q указывает на вершину дерева, в которую ведет ребро веса key[v].
Множество ребер строящегося дерева явно не хранится; его можно восстановить как
A ={( v, [v] ): vV \ {r} \ Q }
В конце работы алгоритма очередь Q пуста, а множество
A ={( v, [v] ): vV \ {r} }
Есть множество ребер покрываюшего дерева
MST-PRIM (G, w, r)
1 Q V[G]
2 for (для) каждой вершины u Q
3 do key[u]
4 key[r]0
5 [r] NIL
6 while Q
7 do u EXTRACT-MIN(Q)
8 for (для) каждой вершины v Adj[u]
9 do if vQ и w(u,v) < key[v]
10 then [v] u
11 key[v] w(u,v)
Оценка времени работы алгоритма Прима
Если для организации очереди Q использовать двоичную кучу, инициализацию в строках 1-4 можно выполнить за время O(V).
Цикл выполняеется Vраз, и каждая операция EXTRACT-MIN занимает время O(log V), всего O(V log V).
Цикл в строках 8-11 выполняется в общей сложности O(E) раз. Проверку принадлежности в строке 9 внутри цикла можно реализовать за O(1).
Присваивание в строке 11 может быть выполнена за время O(log V).
Всего получаем O(V log V + E log V) = O( E log V).