SlideShare a Scribd company logo
Лекция 10
Остовные деревья
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net/teaching
Задача
2
 Имеется n городов, которые необходимо соединить дорогами,
так, чтобы можно было добраться из любого города в любой другой
(напрямую или через другие города)
 Известна стоимость строительства дороги между любой парой городов
(задан взвешенный граф)
 Между какими городами строить дороги?
2
87
65
45
140
43
94
98
110
78
49
Новосибирск
Бийск
Томск
Барнаул
Кемерово
Задача
33
87
65
45
140
43
94
98
110
78
49
Новосибирск
Бийск
Томск
Барнаул
Кемерово
Стоимость проекта
87 + 65 + 49 + 140 = 341
 Имеется n городов, которые необходимо соединить дорогами,
так, чтобы можно было добраться из любого города в любой другой
(напрямую или через другие города)
 Известна стоимость строительства дороги между любой парой городов
(задан взвешенный граф)
 Между какими городами строить дороги?
Задача
44
87
65
45
140
43
94
98
110
78
49
Новосибирск
Бийск
Томск
Барнаул
Кемерово
Стоимость проекта
65 + 49 + 140 + 43 = 297
 Имеется n городов, которые необходимо соединить дорогами,
так, чтобы можно было добраться из любого города в любой другой
(напрямую или через другие города)
 Известна стоимость строительства дороги между любой парой городов
(задан взвешенный граф)
 Между какими городами строить дороги?
Остовные деревья
5
 О́стовное дерево связного графа (Spanning tree) –
это ациклический связный подграф (дерево),
в который входят все вершины данного графа
5
1
2
3
4
5
 Синонимы: остов, покрывающее дерево, скелет графа
1
2
3
4
5
Это не остов –
присутствует
цикл
Остовные деревья минимальной стоимости
6
 Если граф взвешенный, то рассматривается задача
о нахождении остовного дерева с минимальной суммой
весов входящих в него рёбер
6
1
2
5
3
4
100
10
30
50
10
20
60
1
2
5
3
4
100
10
30
50
10
20
60
Cost = 10 + 50 + 10 + 60 = 130 Cost = 100 + 10 + 50 + 20 = 180
Применение остовных деревьев
7
 Остовное дерево минимальной стоимости
(Minimum spanning tree, MST) – это остовное дерево
с минимальной суммой весов его ребер
 Практическое применение MST
 Формирование дерева для широковещательной
рассылки информации в сети (tree for broadcasting)
 прокладка TV-кабеля между домами (вес ребер –
стоимость прокладки кабеля между парой домов)
 Spanning Tree Protocol в телекоммуникационных сетях
стандарта Ethernet для предотвращения образования
циклов в сети
 …
7
Алгоритмы построения MST
8
Алгоритм
Вычислительная сложность
Матрица
смежности
Списки смежности +
двоичная куча
Списки смежности +
фибоначчиева куча
Крускала
(J. Kruskal, 1956)
𝑂(|𝐸| log |𝑉|)
Прима
(V. Jarník, 1930;
R. Prim, 1957;
E. Dijkstra, 1959)
𝑂( 𝑉 2) 𝑂(( 𝑉 + |𝐸|) log |𝑉|) 𝑂( 𝐸 + |𝑉| log |𝑉|)
Борувки
(O. Borůvka, 1926)
𝑂(|𝐸| log |𝑉|)
(B. Chazelle, 2000)
𝑂(|𝐸| ∙ 𝛼( 𝐸 , |𝑉|)),
где α(m, n) – обратная функция Аккермана
Система непересекающихся множеств
9
 Система непересекающихся множеств
(Disjoint-set data structure) – структура данных
для представления непересекающихся множеств
 Поддерживает следующие операции:
 MakeSet(i) – создает множество из одного элемента i
 FindSet(i) – возвращает номер множества,
которому принадлежит элемент i
 UnionSets(i, j) – объединяет множества, содержащие
элементы i и j
 Подробное описание
 (Aho, С. 169, MFSET)
 (Levitin, С. 381)
 (CLRS, С. 582)
Система непересекающихся множеств
10
 MakeSet(1)
 MakeSet(4)
 MakeSet(6)
 MakeSet(3)
{1}, {4}, {6}, {3}
 UnionSets(1, 3)
{1, 3}, {4}, {6}
 UnionSets(4, 3)
{1, 3, 4}, {6}
Алгоритм Крускала (Kruskal)
11
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
1. Создается пустой граф T из n вершин,
несвязанных ребрами
2. Все ребра исходного графа G
помещают в очередь с приоритетом
Приоритет – вес ребра wij
(ребра упорядочиваются
по не убыванию весов – min heap)
G
2
1
4
6
3
5
T
Prio. Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
В графе T 6 компонент
связности
Алгоритм Крускала (Kruskal)
12
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Prio. Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
Алгоритм Крускала (Kruskal)
13
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
Алгоритм Крускала (Kruskal)
14
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Q: (4, 6), (2, 5), (3, 6), (2, 3), …
Алгоритм Крускала (Kruskal)
15
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Q: (2, 5), (3, 6), (2, 3), …
Алгоритм Крускала (Kruskal)
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Q: (3, 6), (2, 3), …
Алгоритм Крускала (Kruskal)
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Q: (2, 3), …
Алгоритм Крускала (Kruskal)
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации
(по количеству ребер в MST)
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
 Построили остовное дерево T
минимальной стоимости (MST)
 Стоимость 1 + 5 + 3 + 4 + 2 = 15
Алгоритм Крускала (Kruskal)
19
function MST_Kruskal([in] G, [out] T)
// Input: G = (V, E)
// Output: T = (V, E’)
T = CreateGraph(|V|)
// Помещаем вершину i в отдельное множество
// (компоненту связности графа T)
for each i in V do
MakeSet(i)
end for
// Помещаем ребра в очередь с приоритетом
for each (i, j) in E do
PriorityQueueInsert(w[i][j], (i, j))
end for
C = |V| // Количество компонент связности
Алгоритм Крускала (Kruskal)
20
while C > 1 do
// Извлекаем ребро с минимальным весом
(i, j) = PriorityQueueRemoveMin()
seti = FindSet(i)
setj = FindSet(j)
if seti != setj then
// Концы ребра из разных множеств
GraphAddEdge(T, (i, j))
UnionSets(i, j)
C = C - 1
end if
end for
end function
Алгоритм Крускала (Kruskal)
21
function MST_Kruskal([in] G, [out] T)
// Input: G = (V, E)
// Output: T = (V, E’)
T = CreateGraph(|V|)
// Помещаем вершину i в отдельное множество
// (компоненту связности графа T)
for each i in V do
MakeSet(i)
end for
// Помещаем ребра в очередь с приоритетом
for each (i, j) in E do
PriorityQueueInsert(w[i][j], (i, j))
end for
C = |V| // Количество компонент связности
MFSET (Aho)
O(|V|)
Binary heap
O(|E|log|E|)
Алгоритм Крускала (Kruskal)
22
while C > 1 do
// Извлекаем ребро с минимальным весом
(i, j) = PriorityQueueRemoveMin()
seti = FindSet(i)
setj = FindSet(j)
if seti != setj then
// Вершины ребра из разных множеств
GraphAddEdge(T, (i, j))
UnionSets(i, j)
C = C - 1
end if
end for
end function
O(log|E|)
O(1)
O(1)
O(|V|)
 В худшем случае цикл выполняется |E| раз
Алгоритм Крускала (Binary heap + MFSET)
23
𝑇Kruskal = 𝑂 𝑉 + 𝑂 𝐸 log 𝐸 + 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2
Извлечение
ребер из
очереди
Объединение
множеств
Вставка ребер
в очередь
Создание
множеств
log 𝐸 ≤ log 𝑉 2 = 2 log |𝑉|
𝑇Kruskal = 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2 = 𝑂 𝐸 log 𝑉 + 𝑂 𝑉 2
 Отчего зависит сложность алгоритма Крускала
 от реализации сортировки ребер по их весу (Sort, Binary heap, …)
 от реализации системы непересекающихся множеств
/* mfset.h: Disjoint set data structure */
struct set {
int size;
int first;
};
struct elem {
int set;
int next;
};
struct mfset {
struct set *sets;
struct elem *elems;
int nelems;
int nsets;
};
MFSET
24elems
sets
struct mfset *mfset_create(int nelems)
{
struct mfset *p;
int i;
p = malloc(sizeof(*p));
p->nelems = nelems;
p->nsets = 0;
p->sets = malloc(sizeof(struct set) * nelems);
p->elems = malloc(sizeof(struct elem) * nelems);
for (i = 0; i < nelems; i++) {
p->sets[i].size = 0;
p->sets[i].first = -1;
p->elems[i].set = -1;
p->elems[i].next = -1;
}
return p;
}
MFSET
TCreate = O(nelems)
void mfset_free(struct mfset *set)
{
free(set->sets);
free(set->elems);
free(set);
}
void mfset_makeset(struct mfset *set, int elem)
{
set->sets[set->nsets].size = 1;
set->sets[set->nsets].first = elem;
set->elems[elem].set = set->nsets;
set->elems[elem].next = -1;
set->nsets++;
}
MFSET
26
TMakeSet = O(1)
MFSET
27
int mfset_findset(struct mfset *set, int elem)
{
return set->elems[elem].set;
}
TFindSet = O(1)
void mfset_union(struct mfset *set,
int elem1, int elem2)
{
int temp, i, set1, set2;
set1 = mfset_findset(set, elem1);
set2 = mfset_findset(set, elem2);
if (set->sets[set1].size <
set->sets[set2].size)
{
temp = set1;
set1 = set2;
set2 = temp;
}
MFSET
28
/* S1 > S2; Merge elems of S2 to S1 */
i = set->sets[set2].first;
while (set->elems[i].next != -1) {
set->elems[i].set = set1;
i = set->elems[i].next;
}
/* Add elems of S1 to the end of S2 */
set->elems[i].set = set1;
set->elems[i].next = set->sets[set1].first;
set->sets[set1].first = set->sets[set2].first;
set->sets[set1].size += set->sets[set2].size;
/* Remove S2 */
set->sets[set2].size = 0;
set->sets[set2].first = -1;
set->nsets--;
}
MFSET
29
TUnion = O(n)
int search_mst_kruskal(struct graph *g,
struct graph *mst)
{
struct mfset *set;
struct heap *pq;
struct heapvalue edge;
struct heapitem item`;
int mstlen, i, j, n, w, s1, s2;
n = g->nvertices;
mstlen = 0;
/* Create forest (N sets) */
set = mfset_create(n);
for (i = 0; i < n; i++) {
mfset_makeset(set, i);
}
Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap)
30
/* Insert edges in heap */
pq = heap_create(n * n);
/* For all edges (adj. matrix) */
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
w = graph_get_edge(g, i + 1,
j + 1);
if (w > 0) {
edge.i = i;
edge.j = j;
heap_insert(pq, w, edge);
}
}
}
Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap)
31
Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap)
32
for (i = 0; i < n - 1; ) {
item = heap_removemin(pq);
s1 = mfset_findset(set, item.value.i);
s2 = mfset_findset(set, item.value.j);
if (s1 != s2) {
mfset_union(set, item.value.i,
item.value.j);
mstlen += item.priority;
graph_set_edge(mst, item.value.i + 1,
item.value.j + 1,
item.priority);
i++;
}
}
heap_free(pq);
mfset_free(set);
return mstlen;
}
Пример
33
int main()
{
struct graph *g, *mst;
int i, j, mstlen;
g = graph_create(6);
graph_set_edge(g, 1, 2, 6);
graph_set_edge(g, 1, 3, 1);
graph_set_edge(g, 1, 4, 5);
graph_set_edge(g, 2, 3, 5);
graph_set_edge(g, 2, 5, 3);
graph_set_edge(g, 3, 4, 5);
graph_set_edge(g, 3, 5, 6);
graph_set_edge(g, 3, 6, 4);
graph_set_edge(g, 4, 6, 2);
graph_set_edge(g, 5, 6, 6);
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
mst = graph_create(6);
mstlen = search_mst_kruskal(g, mst);
printf("Minimum spanning tree: %dn", mstlen);
for (i = 0; i < 6; i++) {
for (j = 0; j < 6; j++) {
printf("%4d ", graph_get_edge(mst,
i + 1, j + 1));
}
printf("n");
}
graph_free(mst);
graph_free(g);
return 0;
}
Пример
34
Пример
35
$ ./kruskal
Minimum spanning tree: 15
0 0 1 0 0 0
0 0 5 0 3 0
1 5 0 0 0 4
0 0 0 0 0 2
0 3 0 0 0 0
0 0 4 2 0 0
Алгоритм Прима (Prim)
36
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
1. Создается пустой граф T.
2. Во множество U помещается
вершина 1, с которой начнется
формирование остова.
3. Цикл пока U ≠ V
a) Найти ребро (i, j) с наименьшим
весом такое, что i  U и j  V
b) Добавить ребро (i, j) в граф T
c) Добавить вершину j
во множество U
G
2
1
4
6
3
5
T
Домашнее чтение
 Прочитать о системе непересекающихся множеств
в [Aho] и [CLRS]

More Related Content

PDF
Лекция 10: Графы. Остовные деревья
PDF
Лекция 10. Графы. Остовные деревья минимальной стоимости
PDF
Лекция 7. Бинарные кучи. Пирамидальная сортировка
PDF
Лекция 8: Графы. Обходы графов
PDF
Лекция 9. Поиск кратчайшего пути в графе
PDF
Лекция 11. Методы разработки алгоритмов
PDF
Лекция 7. Стандарт OpenMP (подолжение)
PDF
Лекция 4: Стек. Очередь
Лекция 10: Графы. Остовные деревья
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 8: Графы. Обходы графов
Лекция 9. Поиск кратчайшего пути в графе
Лекция 11. Методы разработки алгоритмов
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 4: Стек. Очередь

What's hot (20)

PDF
Лекция 8. Графы. Обходы графов
PDF
Лекция 4. Стеки и очереди
PDF
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
PDF
Лекция 7: Бинарные кучи (пирамиды)
PDF
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
PDF
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
PDF
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
PDF
Лекция 8: Графы. Обходы графов
PDF
Векторизация кода (семинар 3)
PDF
Лекция 1. Анализ эффективности алгоритмов
PDF
Лекция 1: Введение в алгоритмы
PDF
Лекция 2. Алгоритмы сортировки
PDF
Лекция 1: Введение в алгоритмы
PDF
Векторизация кода (семинар 2)
PDF
Лекция 4. Префиксные деревья (tries, prefix trees)
PDF
Лекция 4: Стеки и очереди
PDF
Лекция 9: Графы. Поиск кратчайшего пути в графе
PDF
Лекция 3: Бинарный поиск. Связные списки
PDF
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
PDF
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 8. Графы. Обходы графов
Лекция 4. Стеки и очереди
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция 7: Бинарные кучи (пирамиды)
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 8: Графы. Обходы графов
Векторизация кода (семинар 3)
Лекция 1. Анализ эффективности алгоритмов
Лекция 1: Введение в алгоритмы
Лекция 2. Алгоритмы сортировки
Лекция 1: Введение в алгоритмы
Векторизация кода (семинар 2)
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4: Стеки и очереди
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 3: Бинарный поиск. Связные списки
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция 10. Биномиальные кучи (Binomial heaps)
Ad

Viewers also liked (20)

PDF
Лекция 3. АВЛ-деревья (AVL trees)
PDF
Лекция 5. Бинарные деревья поиска
PDF
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
PDF
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
PDF
Семинар 10. Параллельное программирование на MPI (часть 3)
PDF
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Лекция 12: Трудноразрешимые задачи
PDF
Лекция 4. Префиксные деревья (Tries, prefix trees)
PDF
Семинар 12. Параллельное программирование на MPI (часть 5)
PDF
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
PDF
Лекция 5. B-деревья (B-trees, k-way merge sort)
PDF
Лекция 11: Методы разработки алгоритмов
PDF
Лекция 6. Хеш-таблицы
PDF
Лекция 1. Амортизационный анализ (Amortized analysis)
PDF
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
PDF
Лекция 1. Амортизационный анализ (amortized analysis)
PDF
Лекция 3. АВЛ-деревья (AVL trees)
PDF
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 5. Бинарные деревья поиска
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 9. Дерево ван Эмде Боаса (van Emde Boas tree)
Семинар 10. Параллельное программирование на MPI (часть 3)
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 12: Трудноразрешимые задачи
Лекция 4. Префиксные деревья (Tries, prefix trees)
Семинар 12. Параллельное программирование на MPI (часть 5)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 11: Методы разработки алгоритмов
Лекция 6. Хеш-таблицы
Лекция 1. Амортизационный анализ (Amortized analysis)
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 5. B-деревья (B-trees, k-way merge sort)
Ad

Similar to Лекция 10: Графы. Остовные деревья минимальной стоимости (20)

PDF
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
PDF
20071125 efficientalgorithms kulikov_lecture09
PPT
практика 15
PDF
"Знакомьтесь, М*" Муратшин Борис, 2ГИС
PPT
практика 13
PDF
Лекция 9: Графы. Кратчайшие пути в графах
PPT
графы
PPT
Лекция 5 Элементарные структуры данных часть 3
PPTX
презентация
PDF
Формальные основы иерархической записи графов
PPT
лекция 13
PDF
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Лекция 5: Бинарные деревья поиска
PPT
Лекция 6 Элементарные структуры данных часть 4
PDF
Алгоритмы и структуры данных BigData для графов большой размерности
PDF
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
PDF
Алгоритмы и структуры данных осень 2013 лекция 1
PPTX
Структуры данных в JavaScript | Odessa Frontend Meetup #13
PDF
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
PDF
Элементы дискретной математики для программистов
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
20071125 efficientalgorithms kulikov_lecture09
практика 15
"Знакомьтесь, М*" Муратшин Борис, 2ГИС
практика 13
Лекция 9: Графы. Кратчайшие пути в графах
графы
Лекция 5 Элементарные структуры данных часть 3
презентация
Формальные основы иерархической записи графов
лекция 13
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 5: Бинарные деревья поиска
Лекция 6 Элементарные структуры данных часть 4
Алгоритмы и структуры данных BigData для графов большой размерности
Лекция 9: Декартовы деревья (Treaps, дучи, дерамиды)
Алгоритмы и структуры данных осень 2013 лекция 1
Структуры данных в JavaScript | Odessa Frontend Meetup #13
Лекция 3: Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Элементы дискретной математики для программистов

More from Mikhail Kurnosov (12)

PDF
Векторизация кода (семинар 1)
PDF
Лекция 6. Стандарт OpenMP
PDF
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
PDF
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
PDF
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
PDF
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
PDF
Семинар 11. Параллельное программирование на MPI (часть 4)
PDF
Семинар 9. Параллельное программирование на MPI (часть 2)
PDF
Семинар 8. Параллельное программирование на MPI (часть 1)
PDF
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
PDF
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Векторизация кода (семинар 1)
Лекция 6. Стандарт OpenMP
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)

Лекция 10: Графы. Остовные деревья минимальной стоимости

  • 1. Лекция 10 Остовные деревья Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net/teaching
  • 2. Задача 2  Имеется n городов, которые необходимо соединить дорогами, так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города)  Известна стоимость строительства дороги между любой парой городов (задан взвешенный граф)  Между какими городами строить дороги? 2 87 65 45 140 43 94 98 110 78 49 Новосибирск Бийск Томск Барнаул Кемерово
  • 3. Задача 33 87 65 45 140 43 94 98 110 78 49 Новосибирск Бийск Томск Барнаул Кемерово Стоимость проекта 87 + 65 + 49 + 140 = 341  Имеется n городов, которые необходимо соединить дорогами, так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города)  Известна стоимость строительства дороги между любой парой городов (задан взвешенный граф)  Между какими городами строить дороги?
  • 4. Задача 44 87 65 45 140 43 94 98 110 78 49 Новосибирск Бийск Томск Барнаул Кемерово Стоимость проекта 65 + 49 + 140 + 43 = 297  Имеется n городов, которые необходимо соединить дорогами, так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города)  Известна стоимость строительства дороги между любой парой городов (задан взвешенный граф)  Между какими городами строить дороги?
  • 5. Остовные деревья 5  О́стовное дерево связного графа (Spanning tree) – это ациклический связный подграф (дерево), в который входят все вершины данного графа 5 1 2 3 4 5  Синонимы: остов, покрывающее дерево, скелет графа 1 2 3 4 5 Это не остов – присутствует цикл
  • 6. Остовные деревья минимальной стоимости 6  Если граф взвешенный, то рассматривается задача о нахождении остовного дерева с минимальной суммой весов входящих в него рёбер 6 1 2 5 3 4 100 10 30 50 10 20 60 1 2 5 3 4 100 10 30 50 10 20 60 Cost = 10 + 50 + 10 + 60 = 130 Cost = 100 + 10 + 50 + 20 = 180
  • 7. Применение остовных деревьев 7  Остовное дерево минимальной стоимости (Minimum spanning tree, MST) – это остовное дерево с минимальной суммой весов его ребер  Практическое применение MST  Формирование дерева для широковещательной рассылки информации в сети (tree for broadcasting)  прокладка TV-кабеля между домами (вес ребер – стоимость прокладки кабеля между парой домов)  Spanning Tree Protocol в телекоммуникационных сетях стандарта Ethernet для предотвращения образования циклов в сети  … 7
  • 8. Алгоритмы построения MST 8 Алгоритм Вычислительная сложность Матрица смежности Списки смежности + двоичная куча Списки смежности + фибоначчиева куча Крускала (J. Kruskal, 1956) 𝑂(|𝐸| log |𝑉|) Прима (V. Jarník, 1930; R. Prim, 1957; E. Dijkstra, 1959) 𝑂( 𝑉 2) 𝑂(( 𝑉 + |𝐸|) log |𝑉|) 𝑂( 𝐸 + |𝑉| log |𝑉|) Борувки (O. Borůvka, 1926) 𝑂(|𝐸| log |𝑉|) (B. Chazelle, 2000) 𝑂(|𝐸| ∙ 𝛼( 𝐸 , |𝑉|)), где α(m, n) – обратная функция Аккермана
  • 9. Система непересекающихся множеств 9  Система непересекающихся множеств (Disjoint-set data structure) – структура данных для представления непересекающихся множеств  Поддерживает следующие операции:  MakeSet(i) – создает множество из одного элемента i  FindSet(i) – возвращает номер множества, которому принадлежит элемент i  UnionSets(i, j) – объединяет множества, содержащие элементы i и j  Подробное описание  (Aho, С. 169, MFSET)  (Levitin, С. 381)  (CLRS, С. 582)
  • 10. Система непересекающихся множеств 10  MakeSet(1)  MakeSet(4)  MakeSet(6)  MakeSet(3) {1}, {4}, {6}, {3}  UnionSets(1, 3) {1, 3}, {4}, {6}  UnionSets(4, 3) {1, 3, 4}, {6}
  • 11. Алгоритм Крускала (Kruskal) 11 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 1. Создается пустой граф T из n вершин, несвязанных ребрами 2. Все ребра исходного графа G помещают в очередь с приоритетом Приоритет – вес ребра wij (ребра упорядочиваются по не убыванию весов – min heap) G 2 1 4 6 3 5 T Prio. Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), … В графе T 6 компонент связности
  • 12. Алгоритм Крускала (Kruskal) 12 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T Prio. Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
  • 13. Алгоритм Крускала (Kruskal) 13 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
  • 14. Алгоритм Крускала (Kruskal) 14 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T Q: (4, 6), (2, 5), (3, 6), (2, 3), …
  • 15. Алгоритм Крускала (Kruskal) 15 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T Q: (2, 5), (3, 6), (2, 3), …
  • 16. Алгоритм Крускала (Kruskal) 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T Q: (3, 6), (2, 3), …
  • 17. Алгоритм Крускала (Kruskal) 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T Q: (2, 3), …
  • 18. Алгоритм Крускала (Kruskal) 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 3. Цикл из n – 1 итерации (по количеству ребер в MST) a) Из очереди извлекается ребро (i, j) с минимальным весом (HeapDeleteMin) b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T G 2 1 4 6 3 5 T  Построили остовное дерево T минимальной стоимости (MST)  Стоимость 1 + 5 + 3 + 4 + 2 = 15
  • 19. Алгоритм Крускала (Kruskal) 19 function MST_Kruskal([in] G, [out] T) // Input: G = (V, E) // Output: T = (V, E’) T = CreateGraph(|V|) // Помещаем вершину i в отдельное множество // (компоненту связности графа T) for each i in V do MakeSet(i) end for // Помещаем ребра в очередь с приоритетом for each (i, j) in E do PriorityQueueInsert(w[i][j], (i, j)) end for C = |V| // Количество компонент связности
  • 20. Алгоритм Крускала (Kruskal) 20 while C > 1 do // Извлекаем ребро с минимальным весом (i, j) = PriorityQueueRemoveMin() seti = FindSet(i) setj = FindSet(j) if seti != setj then // Концы ребра из разных множеств GraphAddEdge(T, (i, j)) UnionSets(i, j) C = C - 1 end if end for end function
  • 21. Алгоритм Крускала (Kruskal) 21 function MST_Kruskal([in] G, [out] T) // Input: G = (V, E) // Output: T = (V, E’) T = CreateGraph(|V|) // Помещаем вершину i в отдельное множество // (компоненту связности графа T) for each i in V do MakeSet(i) end for // Помещаем ребра в очередь с приоритетом for each (i, j) in E do PriorityQueueInsert(w[i][j], (i, j)) end for C = |V| // Количество компонент связности MFSET (Aho) O(|V|) Binary heap O(|E|log|E|)
  • 22. Алгоритм Крускала (Kruskal) 22 while C > 1 do // Извлекаем ребро с минимальным весом (i, j) = PriorityQueueRemoveMin() seti = FindSet(i) setj = FindSet(j) if seti != setj then // Вершины ребра из разных множеств GraphAddEdge(T, (i, j)) UnionSets(i, j) C = C - 1 end if end for end function O(log|E|) O(1) O(1) O(|V|)  В худшем случае цикл выполняется |E| раз
  • 23. Алгоритм Крускала (Binary heap + MFSET) 23 𝑇Kruskal = 𝑂 𝑉 + 𝑂 𝐸 log 𝐸 + 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2 Извлечение ребер из очереди Объединение множеств Вставка ребер в очередь Создание множеств log 𝐸 ≤ log 𝑉 2 = 2 log |𝑉| 𝑇Kruskal = 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2 = 𝑂 𝐸 log 𝑉 + 𝑂 𝑉 2  Отчего зависит сложность алгоритма Крускала  от реализации сортировки ребер по их весу (Sort, Binary heap, …)  от реализации системы непересекающихся множеств
  • 24. /* mfset.h: Disjoint set data structure */ struct set { int size; int first; }; struct elem { int set; int next; }; struct mfset { struct set *sets; struct elem *elems; int nelems; int nsets; }; MFSET 24elems sets
  • 25. struct mfset *mfset_create(int nelems) { struct mfset *p; int i; p = malloc(sizeof(*p)); p->nelems = nelems; p->nsets = 0; p->sets = malloc(sizeof(struct set) * nelems); p->elems = malloc(sizeof(struct elem) * nelems); for (i = 0; i < nelems; i++) { p->sets[i].size = 0; p->sets[i].first = -1; p->elems[i].set = -1; p->elems[i].next = -1; } return p; } MFSET TCreate = O(nelems)
  • 26. void mfset_free(struct mfset *set) { free(set->sets); free(set->elems); free(set); } void mfset_makeset(struct mfset *set, int elem) { set->sets[set->nsets].size = 1; set->sets[set->nsets].first = elem; set->elems[elem].set = set->nsets; set->elems[elem].next = -1; set->nsets++; } MFSET 26 TMakeSet = O(1)
  • 27. MFSET 27 int mfset_findset(struct mfset *set, int elem) { return set->elems[elem].set; } TFindSet = O(1)
  • 28. void mfset_union(struct mfset *set, int elem1, int elem2) { int temp, i, set1, set2; set1 = mfset_findset(set, elem1); set2 = mfset_findset(set, elem2); if (set->sets[set1].size < set->sets[set2].size) { temp = set1; set1 = set2; set2 = temp; } MFSET 28
  • 29. /* S1 > S2; Merge elems of S2 to S1 */ i = set->sets[set2].first; while (set->elems[i].next != -1) { set->elems[i].set = set1; i = set->elems[i].next; } /* Add elems of S1 to the end of S2 */ set->elems[i].set = set1; set->elems[i].next = set->sets[set1].first; set->sets[set1].first = set->sets[set2].first; set->sets[set1].size += set->sets[set2].size; /* Remove S2 */ set->sets[set2].size = 0; set->sets[set2].first = -1; set->nsets--; } MFSET 29 TUnion = O(n)
  • 30. int search_mst_kruskal(struct graph *g, struct graph *mst) { struct mfset *set; struct heap *pq; struct heapvalue edge; struct heapitem item`; int mstlen, i, j, n, w, s1, s2; n = g->nvertices; mstlen = 0; /* Create forest (N sets) */ set = mfset_create(n); for (i = 0; i < n; i++) { mfset_makeset(set, i); } Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap) 30
  • 31. /* Insert edges in heap */ pq = heap_create(n * n); /* For all edges (adj. matrix) */ for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { w = graph_get_edge(g, i + 1, j + 1); if (w > 0) { edge.i = i; edge.j = j; heap_insert(pq, w, edge); } } } Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap) 31
  • 32. Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap) 32 for (i = 0; i < n - 1; ) { item = heap_removemin(pq); s1 = mfset_findset(set, item.value.i); s2 = mfset_findset(set, item.value.j); if (s1 != s2) { mfset_union(set, item.value.i, item.value.j); mstlen += item.priority; graph_set_edge(mst, item.value.i + 1, item.value.j + 1, item.priority); i++; } } heap_free(pq); mfset_free(set); return mstlen; }
  • 33. Пример 33 int main() { struct graph *g, *mst; int i, j, mstlen; g = graph_create(6); graph_set_edge(g, 1, 2, 6); graph_set_edge(g, 1, 3, 1); graph_set_edge(g, 1, 4, 5); graph_set_edge(g, 2, 3, 5); graph_set_edge(g, 2, 5, 3); graph_set_edge(g, 3, 4, 5); graph_set_edge(g, 3, 5, 6); graph_set_edge(g, 3, 6, 4); graph_set_edge(g, 4, 6, 2); graph_set_edge(g, 5, 6, 6); 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4
  • 34. mst = graph_create(6); mstlen = search_mst_kruskal(g, mst); printf("Minimum spanning tree: %dn", mstlen); for (i = 0; i < 6; i++) { for (j = 0; j < 6; j++) { printf("%4d ", graph_get_edge(mst, i + 1, j + 1)); } printf("n"); } graph_free(mst); graph_free(g); return 0; } Пример 34
  • 35. Пример 35 $ ./kruskal Minimum spanning tree: 15 0 0 1 0 0 0 0 0 5 0 3 0 1 5 0 0 0 4 0 0 0 0 0 2 0 3 0 0 0 0 0 0 4 2 0 0
  • 36. Алгоритм Прима (Prim) 36 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4 1. Создается пустой граф T. 2. Во множество U помещается вершина 1, с которой начнется формирование остова. 3. Цикл пока U ≠ V a) Найти ребро (i, j) с наименьшим весом такое, что i  U и j  V b) Добавить ребро (i, j) в граф T c) Добавить вершину j во множество U G 2 1 4 6 3 5 T
  • 37. Домашнее чтение  Прочитать о системе непересекающихся множеств в [Aho] и [CLRS]