SlideShare a Scribd company logo
1 of 37
Download to read offline
Лекция 10
Остовные деревья
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры и алгоритмы обработки данных»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Весенний семестр, 2015
Задача
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, С. 597)
Система непересекающихся множеств
10
 MakeSet(1)
 MakeSet(4)
 MakeSet(6)
 MakeSet(3)
4 множества: {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
𝑇 𝐾𝑟𝑢𝑠𝑘𝑎𝑙 = 𝑂 𝑉 + 𝑂 𝐸 log 𝐸 + 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2
Извлечение
ребер из
очереди
Объединение
множеств
Вставка ребер
в очередь
Создание
множеств
log 𝐸 ≤ log 𝑉 2
= 2 log |𝑉|
𝑇 𝐾𝑟𝑢𝑠𝑘𝑎𝑙 = 𝑂 𝐸 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

What's hot

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Nikolay Grebenshikov
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяMikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахMikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Mikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 

What's hot (20)

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

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

TMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry ZaitsevTMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry ZaitsevIosif Itkin
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Technopark
 
!Predictive analytics part_2
!Predictive analytics part_2!Predictive analytics part_2
!Predictive analytics part_2Vladimir Krylov
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 
Разведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе RРазведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе RSergey Mastitsky
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Mikhail Kurnosov
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...Alexey Paznikov
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметикуAndrey Akinshin
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Mikhail Kurnosov
 
Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...
Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...
Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...AIST
 
07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduceRoman Brovko
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...pgdayrussia
 

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

Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
TMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry ZaitsevTMPA-2013 Dmitry Zaitsev
TMPA-2013 Dmitry Zaitsev
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4
 
!Predictive analytics part_2
!Predictive analytics part_2!Predictive analytics part_2
!Predictive analytics part_2
 
C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 
Разведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе RРазведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе R
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
графы
графыграфы
графы
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 
Продолжаем говорить про арифметику
Продолжаем говорить про арифметикуПродолжаем говорить про арифметику
Продолжаем говорить про арифметику
 
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
 
Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...
Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...
Елена Захаренко и Евгений Альтман - Быстрый алгоритм оценки движения полным п...
 
07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 3...
 

More from Mikhail Kurnosov

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаMikhail Kurnosov
 

More from Mikhail Kurnosov (19)

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 

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

  • 1. Лекция 10 Остовные деревья Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Весенний семестр, 2015
  • 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, С. 597)
  • 10. Система непересекающихся множеств 10  MakeSet(1)  MakeSet(4)  MakeSet(6)  MakeSet(3) 4 множества: {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 𝑇 𝐾𝑟𝑢𝑠𝑘𝑎𝑙 = 𝑂 𝑉 + 𝑂 𝐸 log 𝐸 + 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2 Извлечение ребер из очереди Объединение множеств Вставка ребер в очередь Создание множеств log 𝐸 ≤ log 𝑉 2 = 2 log |𝑉| 𝑇 𝐾𝑟𝑢𝑠𝑘𝑎𝑙 = 𝑂 𝐸 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]