SlideShare a Scribd company logo
1 of 50
Download to read offline
Лекция 8
Графы. Обходы графов
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net/teaching
Понятие графа
2
 Граф (graph) – это совокупность непустого множества
𝑉 вершин и множества 𝐸 ребер
𝐺 = 𝑉, 𝐸 ,
𝑛 = 𝑉 , 𝑚 = |𝐸|,
𝑉 = 1,2, … , 𝑛 , 𝐸 = { 𝑢1, 𝑣1 , 𝑢2, 𝑣2 , … , (𝑢 𝑚, 𝑣 𝑚)}
𝑽 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓
𝑬 = 𝟏, 𝟓 , 𝟐, 𝟓 , 𝟐, 𝟑 , 𝟐, 𝟒 , (𝟑, 𝟒)
(1, 5) и (5, 1) – это одно и тоже ребро
vertex
edge
Виды графов
3
Графы (graphs)
Неориентированные графы
(Undirected graphs)
Ребра (edges) не имеют направлений
Ориентированные графы
(Directed graphs)
Ребра – дуги (arcs, edges)
имеют направления
(1, 2) и (2, 1) – одно и тоже ребро (1, 3) и (3, 1) – разные дуги!
Основные определения
4
Вершина (vertex, node)
Смежные вершины
(adjacent vertices)
Ребро (4, 6) инцидентно
(incident) вершинам 4 и 6
Ребро (edge, link)
Путь (path) – последовательность
вершин, в которой следующая
вершина (после первой) является
смежной с предыдущей –
все вершины и ребра различны
Путь: (10, 8, 3, 5)
Основные определения
5
Цикл (cycle) – путь, в котором
первая и последняя вершины
совпадают: (4, 6, 7, 8, 3, 4)
Степень вершины
(vertex degree) –
количество ребер,
инцидентных вершине
deg(7) = 2, deg(1) = 3
Связный граф
(connected graph) – граф,
в котором существует путь из
каждой вершины в любую другую
Основные определения
6
 Взвешенный граф (weighted graph) – это граф, ребрами
(дугам) которого назначены веса
 Вес ребра (𝑖, 𝑗) обозначим как 𝑤𝑖𝑗
𝑤34 = 5, 𝑤42 = 24, …
Основные определения
7
Полный граф (complete graph) –
это граф, в котором каждая пара
различных вершин смежна
(каждая вершина соединена со всеми)
Количество ребер в полном
неориентированном графе:
𝑚 =
𝑛(𝑛 − 1)
2
Насыщенность D графа (density):
𝐷 =
2𝑚
𝑛(𝑛 − 1)
У полного графа насыщенность D = 1
𝐷 =
4
4 ∙ 3
2
=
4
6
= 0.66
Основные определения
8
Насыщенный граф (dense graph) –
это граф, в котором количество ребер
близко к максимально возможному
𝐸 = 𝑂( 𝑉 2
)
𝐷 =
2∙19
7∙6
= 0.9, 𝐷 > 0.5
Разреженный граф (sparse graph) –
граф, в котором количество ребер
близко к количеству вершин в графе
𝐸 = 𝑂(|𝑉|)
𝐷 =
2∙7
7∙6
= 0.33, 𝐷 < 0.5
Представление графов в памяти
9
 Представление графа в памяти (формат его хранения)
определяет вычислительную сложность операций над
графом и объем требуемой памяти
 Основные способы представления графов в памяти:
 матрица смежности (adjacency matrix) –
эффективна для насыщенных графов
 список смежных вершин (adjacency list) –
эффективен для разреженных графов
Матрица смежности
10
 Матрица A смежности
(adjacency matrix) – это матрица
n × n элементов, в которой
𝑎𝑖𝑗 =
1, если 𝑖, 𝑗 ∈ 𝐸,
0, иначе.
 Объем требуемой памяти 𝑂( 𝑉 2
)
 Быстрое определение
присутствия ребра (𝑖, 𝑗) в графе
 За время O(1) получаем доступ
к элементу 𝑎𝑖𝑗 матрицы
Эффективна для насыщенных графов (|E| ≈ |V|2)
Матрица смежности
11
 Какого размера граф можно разместить в оперативной
памяти объемом 8 Гб использую матрицу смежности?
int a[n][n];
Матрица смежности
12
 Какого размера граф можно разместить в оперативной
памяти объемом 8 Гб использую матрицу смежности?
int a[n][n];
 sizeof(int) = 4 байта
 8 Гб = 8 ∙ 230 байт
 8 ∙ 230 / 4 = 2 ∙ 230 – можно разместить 231 = 2 147 483 648 элементов
типа int
 𝑛 = 231 = 46340 – количество строки и столбцов
int a[46340][46340];
 Надо учесть, что часть памяти занята ОС и другими программами
(предполагаем, что доступно 90% памяти (~ 7 Гб), тогда n = 43 347)
 Сколько поместится элементов типа unsigned char или uint8_t?
Список смежных вершин
13
 Список смежных вершин
(adjacency list) – это массив A[n], каждый
элемент A[i] которого содержит список
узлов смежных с вершиной i
Эффективен для разряженных графов (|E| ≈ |V|)
Список смежных вершин
14
 Реализация списка смежных вершин на
основе массивов A[n + 1] и L[2m]
 Список смежных вершин узла i:
L[A[i]], L[A[i] + 1], …, L[A[i + 1] – 1]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2 4 1 3 5 6 2 4 6 1 3 2 2 3 6
1 2 3 4 5 6 7
1 3 7 10 12 13 15A:
L:
– индексы начала и конца списка
смежных вершин в массиве L
Список смежных вершин
15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
2 4 1 3 5 6 2 4 6 1 3 2 2 3 6
1 2 3 4 5 6 7
1 3 7 10 12 13 15A:
L:
– индексы начала и конца списка
смежных вершин в массиве L
// Обход смежных вершин узла i
for (j = A[i]; j < A[i + 1]; j++) {
v = L[j];
// Обработать вершину v
}
 Количество смежных узлов вершины i:
A[i + 1] – A[i]
Ошибка из-за петли!
T = O(m)
Графы в реальной жизни
16
Граф социальной сети
 Задан начальный
пользователь (узел графа)
 Как начиная со стартового
узла найти пользователя
с заданным именем?
 Как перебрать всех
пользователей и применить
к ним некоторую
процедуру?
 изменить профиль
 вычислить число
пользователей старше
20 лет
 Обход графа (Graph traversal) – это процедура перебора
(посещения) всех вершин графа начиная с заданной
Графы в реальной жизни
17Граф социальной сети
Поиск в глубину (Depth-First Search, DFS)
18
 Поиск в глубину (Depth-First Search – DFS) –
процедура посещения всех вершин графа начиная
с заданного узла v
 Сперва посещаем (обрабатываем) все самые “глубокие”
вершины
function DFS(v)
visited[v] = true
// Обрабатываем данные вершины v
for each u in Adj(v) do // Перебор смежных вершин
if visited[u] = false then
DFS(u) // Рекурсивно обрабатываем вершину u
end if
end for
end function
Поиск в глубину (Depth-First Search, DFS)
19
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
20
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
21
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
22
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
23
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
 Все смежные вершины
узла 5 посещены
 Возвращаемся к узлу 3
Поиск в глубину (Depth-First Search, DFS)
24
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
25
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
26
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
 Все смежные вершины узла 6
посещены
 Возвращаемся к узлу 7, затем к 8
Поиск в глубину (Depth-First Search, DFS)
27
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (Depth-First Search, DFS)
28
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
29
 Поиск в ширину (Breadth-First Search – BFS, обход в
ширину) – процедура посещения всех вершин графа
начиная с заданного узла v
 Сперва посещаем (обрабатываем) свои дочерние вершины
function BFS(v)
visited[v] = true
// Обрабатываем вершину v
QueueEnqueue(v) // Помещаем v в очередь вершин
while QueueSize() > 0 do
u = QueueDequeue() // Извлекаем вершину
for each x in Adj(u) do
if visited[x] = false then
QueueEnqueue(x)
visited[x] = true
// Обрабатываем узел x
end if
end for
end while
end function
Поиск в ширину (Breadth-First Search, BFS)
30
Поиск в ширину (Breadth-First Search, BFS)
31
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 2
 В очереди:
1, 3, 5
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
32
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 1
 В очереди:
3, 5, 4
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
33
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 3
 В очереди:
5, 4, 8
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
34
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 5
 В очереди:
4, 8
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
35
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 4
 В очереди:
8, 6
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
36
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 8
 В очереди:
6, 7, 9, 10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
37
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 6
 В очереди:
7, 9, 10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
38
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 7
 В очереди:
9, 10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
39
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 9
 В очереди:
10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (Breadth-First Search, BFS)
40
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 10
 В очереди:
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Реализация графа на базе матрицы смежности
41
#include <stdio.h>
#include <stdlib.h>
#include "queue_array.h"
struct graph {
int nvertices; /* Число вершин */
int *m; /* Матрица n x n */
int *visited;
};
struct graph *graph_create(int nvertices)
{
struct graph *g;
g = malloc(sizeof(*g));
g->nvertices = nvertices;
g->visited = malloc(sizeof(int) *
nvertices);
g->m = malloc(sizeof(int)
* nvertices * nvertices);
graph_clear(g); // Опционально, O(n^2)
return g;
}
Реализация графа на базе матрицы смежности
42
TCreate = O(n2)
Memory = O(n2)
Реализация графа на базе матрицы смежности
43
void graph_clear(struct graph *g)
{
int i, j;
for (i = 0; i < g->nvertices; i++) {
g->visited[i] = 0;
for (j = 0; j < g->nvertices; j++) {
g->m[i * g->nvertices + j] = 0;
}
}
} TClear = O(n2)
Реализация графа на базе матрицы смежности
44
void graph_free(struct graph *g)
{
free(g->m);
free(g);
}
/*
* graph_set_edge: Назначает ребру (i, j) вес w
* i, j = 1, 2, ..., n
*/
void graph_set_edge(struct graph *g,
int i, int j, int w)
{
g->m[(i - 1) * g->nvertices + j - 1] = w;
g->m[(j - 1) * g->nvertices + i - 1] = w;
}
int graph_get_edge(struct graph *g, int i, int j)
{
return g->m[(i - 1) * g->nvertices + j - 1];
}
Реализация графа на базе матрицы смежности
45
void graph_dfs(struct graph *g, int v)
{
int i;
g->visited[v - 1] = 1;
printf("Vertex %dn", v);
for (i = 0; i < g->nvertices; i++) {
if (g->m[(v - 1) * g->nvertices + i] > 0
&& g->visited[i] == 0)
{
graph_dfs(g, i + 1);
}
}
}
Обход графа в глубину (DFS) – рекурсивная версия
46
TDFS = O(n2)
Обход графа в ширину (BFS)
47
void graph_bfs(struct graph *g, int v)
{
int i, j;
struct queue *q;
for (i = 0; i < g->nvertices; i++)
g->visited[i] = 0;
// Создаем очередь
q = queue_create(g->nvertices);
// Обрабатываем стартовую вершину
g->visited[v - 1] = 1;
printf("Vertex %dn", v);
queue_enqueue(q, v - 1);
Обход графа в ширину (BFS, продолжение)
48
while (queue_size(q) > 0) {
i = queue_dequeue(q);
for (j = 0; j < g->nvertices; j++) {
if (g->m[i * g->nvertices + j] > 0
&& g->visited[j] == 0)
{
queue_enqueue(q, j);
g->visited[j] = 1;
printf("Vertex %dn", j + 1);
}
}
}
queue_free(q);
} TBFS = O(n2)
Пример
49
int main()
{
struct graph *g;
g = graph_create(10);
graph_set_edge(g, 1, 2, 1);
graph_set_edge(g, 1, 4, 1);
/* ... */
printf("DFS:n");
graph_dfs(g, 2);
printf("BFS:n");
graph_bfs(g, 2);
graph_free(g);
return 0;
}
Домашнее чтение
50
 Разобрать доказательство вычислительной сложности
процедур BFS и DFS [Aho, C. 217], [CLRS, С. 613, С. 622]
 Прочитать про формат хранения графов в сжатом виде
 Compressed Sparse Row Graph (CSR)
http://www.boost.org/doc/libs/1_45_0/libs/graph/doc/compr
essed_sparse_row.html
 Sparse matrix
http://en.wikipedia.org/wiki/Sparse_matrix

More Related Content

What's hot

Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиMikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаMikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяMikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Nikolay Grebenshikov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки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
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Mikhail Kurnosov
 

What's hot (20)

Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревьяЛекция 10: Графы. Остовные деревья
Лекция 10: Графы. Остовные деревья
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
 
Лекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные спискиЛекция 3: Бинарный поиск. Связные списки
Лекция 3: Бинарный поиск. Связные списки
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 

Viewers also liked

Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2Ирина Слуцкая
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
опитування
опитуванняопитування
опитуванняkalishnatalka
 
створення сторIнки 11 клас
створення сторIнки 11 класстворення сторIнки 11 клас
створення сторIнки 11 класИрина Слуцкая
 
Сервіс SlideShara
Сервіс SlideSharaСервіс SlideShara
Сервіс SlideSharaalyonka24112
 
додавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 класдодавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 класИрина Слуцкая
 
Цикли з умовою
Цикли з умовоюЦикли з умовою
Цикли з умовоюOlga Lyulchik
 
Основы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графовОсновы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графовAlex Dainiak
 
Основы теории графов 09: раскраски планарных графов, совершенные графы
Основы теории графов 09: раскраски планарных графов, совершенные графыОсновы теории графов 09: раскраски планарных графов, совершенные графы
Основы теории графов 09: раскраски планарных графов, совершенные графыAlex Dainiak
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 

Viewers also liked (20)

Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2Автомат розроб сайтів_огляд_web2
Автомат розроб сайтів_огляд_web2
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Algoritm
AlgoritmAlgoritm
Algoritm
 
масиви
масивимасиви
масиви
 
опитування
опитуванняопитування
опитування
 
створення блогу 11 клас
створення блогу 11 класстворення блогу 11 клас
створення блогу 11 клас
 
створення посту 11кл
створення посту 11клстворення посту 11кл
створення посту 11кл
 
створення сторIнки 11 клас
створення сторIнки 11 класстворення сторIнки 11 клас
створення сторIнки 11 клас
 
Цикли
ЦиклиЦикли
Цикли
 
Сервіс SlideShara
Сервіс SlideSharaСервіс SlideShara
Сервіс SlideShara
 
PowerPoint1
PowerPoint1PowerPoint1
PowerPoint1
 
додавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 класдодавання до блогу документу з Slideshare 11 клас
додавання до блогу документу з Slideshare 11 клас
 
Цикли з умовою
Цикли з умовоюЦикли з умовою
Цикли з умовою
 
Задания ОГЭ на графы
Задания ОГЭ на графыЗадания ОГЭ на графы
Задания ОГЭ на графы
 
Основы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графовОсновы теории графов 05: критерии планарности графов
Основы теории графов 05: критерии планарности графов
 
Основы теории графов 09: раскраски планарных графов, совершенные графы
Основы теории графов 09: раскраски планарных графов, совершенные графыОсновы теории графов 09: раскраски планарных графов, совершенные графы
Основы теории графов 09: раскраски планарных графов, совершенные графы
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
11
1111
11
 

Similar to Лекция 8: Графы. Обходы графов

практика 13
практика 13практика 13
практика 13student_kai
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс2berkas
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Nikolay Grebenshikov
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)mainstreamless
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивыКомпьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивыTatiana Volkova
 
08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduceRoman Brovko
 
read to grafics of function
read to grafics of functionread to grafics of function
read to grafics of functionviktoriya71
 
экспертные системы
экспертные системыэкспертные системы
экспертные системыsokol_klinik
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Mikhail Kurnosov
 
07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduceRoman Brovko
 
Расчёт дифракционных картин
Расчёт дифракционных картинРасчёт дифракционных картин
Расчёт дифракционных картинTimur Shaporev
 

Similar to Лекция 8: Графы. Обходы графов (20)

практика 13
практика 13практика 13
практика 13
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
 
лекция 6
лекция 6лекция 6
лекция 6
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
9893
98939893
9893
 
Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)Введение в Clojure (Никита Прокопов)
Введение в Clojure (Никита Прокопов)
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивыКомпьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
 
6.0a
6.0a6.0a
6.0a
 
08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce
 
read to grafics of function
read to grafics of functionread to grafics of function
read to grafics of function
 
лекция 6
лекция 6лекция 6
лекция 6
 
экспертные системы
экспертные системыэкспертные системы
экспертные системы
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce07 - Hadoop. Решение задач с помощью MapReduce
07 - Hadoop. Решение задач с помощью MapReduce
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Расчёт дифракционных картин
Расчёт дифракционных картинРасчёт дифракционных картин
Расчёт дифракционных картин
 

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
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)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
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

More from Mikhail Kurnosov (17)

Векторизация кода (семинар 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...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 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)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
 

Лекция 8: Графы. Обходы графов

  • 1. Лекция 8 Графы. Обходы графов Курносов Михаил Георгиевич к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net/teaching
  • 2. Понятие графа 2  Граф (graph) – это совокупность непустого множества 𝑉 вершин и множества 𝐸 ребер 𝐺 = 𝑉, 𝐸 , 𝑛 = 𝑉 , 𝑚 = |𝐸|, 𝑉 = 1,2, … , 𝑛 , 𝐸 = { 𝑢1, 𝑣1 , 𝑢2, 𝑣2 , … , (𝑢 𝑚, 𝑣 𝑚)} 𝑽 = 𝟏, 𝟐, 𝟑, 𝟒, 𝟓 𝑬 = 𝟏, 𝟓 , 𝟐, 𝟓 , 𝟐, 𝟑 , 𝟐, 𝟒 , (𝟑, 𝟒) (1, 5) и (5, 1) – это одно и тоже ребро vertex edge
  • 3. Виды графов 3 Графы (graphs) Неориентированные графы (Undirected graphs) Ребра (edges) не имеют направлений Ориентированные графы (Directed graphs) Ребра – дуги (arcs, edges) имеют направления (1, 2) и (2, 1) – одно и тоже ребро (1, 3) и (3, 1) – разные дуги!
  • 4. Основные определения 4 Вершина (vertex, node) Смежные вершины (adjacent vertices) Ребро (4, 6) инцидентно (incident) вершинам 4 и 6 Ребро (edge, link) Путь (path) – последовательность вершин, в которой следующая вершина (после первой) является смежной с предыдущей – все вершины и ребра различны Путь: (10, 8, 3, 5)
  • 5. Основные определения 5 Цикл (cycle) – путь, в котором первая и последняя вершины совпадают: (4, 6, 7, 8, 3, 4) Степень вершины (vertex degree) – количество ребер, инцидентных вершине deg(7) = 2, deg(1) = 3 Связный граф (connected graph) – граф, в котором существует путь из каждой вершины в любую другую
  • 6. Основные определения 6  Взвешенный граф (weighted graph) – это граф, ребрами (дугам) которого назначены веса  Вес ребра (𝑖, 𝑗) обозначим как 𝑤𝑖𝑗 𝑤34 = 5, 𝑤42 = 24, …
  • 7. Основные определения 7 Полный граф (complete graph) – это граф, в котором каждая пара различных вершин смежна (каждая вершина соединена со всеми) Количество ребер в полном неориентированном графе: 𝑚 = 𝑛(𝑛 − 1) 2 Насыщенность D графа (density): 𝐷 = 2𝑚 𝑛(𝑛 − 1) У полного графа насыщенность D = 1 𝐷 = 4 4 ∙ 3 2 = 4 6 = 0.66
  • 8. Основные определения 8 Насыщенный граф (dense graph) – это граф, в котором количество ребер близко к максимально возможному 𝐸 = 𝑂( 𝑉 2 ) 𝐷 = 2∙19 7∙6 = 0.9, 𝐷 > 0.5 Разреженный граф (sparse graph) – граф, в котором количество ребер близко к количеству вершин в графе 𝐸 = 𝑂(|𝑉|) 𝐷 = 2∙7 7∙6 = 0.33, 𝐷 < 0.5
  • 9. Представление графов в памяти 9  Представление графа в памяти (формат его хранения) определяет вычислительную сложность операций над графом и объем требуемой памяти  Основные способы представления графов в памяти:  матрица смежности (adjacency matrix) – эффективна для насыщенных графов  список смежных вершин (adjacency list) – эффективен для разреженных графов
  • 10. Матрица смежности 10  Матрица A смежности (adjacency matrix) – это матрица n × n элементов, в которой 𝑎𝑖𝑗 = 1, если 𝑖, 𝑗 ∈ 𝐸, 0, иначе.  Объем требуемой памяти 𝑂( 𝑉 2 )  Быстрое определение присутствия ребра (𝑖, 𝑗) в графе  За время O(1) получаем доступ к элементу 𝑎𝑖𝑗 матрицы Эффективна для насыщенных графов (|E| ≈ |V|2)
  • 11. Матрица смежности 11  Какого размера граф можно разместить в оперативной памяти объемом 8 Гб использую матрицу смежности? int a[n][n];
  • 12. Матрица смежности 12  Какого размера граф можно разместить в оперативной памяти объемом 8 Гб использую матрицу смежности? int a[n][n];  sizeof(int) = 4 байта  8 Гб = 8 ∙ 230 байт  8 ∙ 230 / 4 = 2 ∙ 230 – можно разместить 231 = 2 147 483 648 элементов типа int  𝑛 = 231 = 46340 – количество строки и столбцов int a[46340][46340];  Надо учесть, что часть памяти занята ОС и другими программами (предполагаем, что доступно 90% памяти (~ 7 Гб), тогда n = 43 347)  Сколько поместится элементов типа unsigned char или uint8_t?
  • 13. Список смежных вершин 13  Список смежных вершин (adjacency list) – это массив A[n], каждый элемент A[i] которого содержит список узлов смежных с вершиной i Эффективен для разряженных графов (|E| ≈ |V|)
  • 14. Список смежных вершин 14  Реализация списка смежных вершин на основе массивов A[n + 1] и L[2m]  Список смежных вершин узла i: L[A[i]], L[A[i] + 1], …, L[A[i + 1] – 1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 4 1 3 5 6 2 4 6 1 3 2 2 3 6 1 2 3 4 5 6 7 1 3 7 10 12 13 15A: L: – индексы начала и конца списка смежных вершин в массиве L
  • 15. Список смежных вершин 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 4 1 3 5 6 2 4 6 1 3 2 2 3 6 1 2 3 4 5 6 7 1 3 7 10 12 13 15A: L: – индексы начала и конца списка смежных вершин в массиве L // Обход смежных вершин узла i for (j = A[i]; j < A[i + 1]; j++) { v = L[j]; // Обработать вершину v }  Количество смежных узлов вершины i: A[i + 1] – A[i] Ошибка из-за петли! T = O(m)
  • 16. Графы в реальной жизни 16 Граф социальной сети  Задан начальный пользователь (узел графа)  Как начиная со стартового узла найти пользователя с заданным именем?  Как перебрать всех пользователей и применить к ним некоторую процедуру?  изменить профиль  вычислить число пользователей старше 20 лет
  • 17.  Обход графа (Graph traversal) – это процедура перебора (посещения) всех вершин графа начиная с заданной Графы в реальной жизни 17Граф социальной сети
  • 18. Поиск в глубину (Depth-First Search, DFS) 18  Поиск в глубину (Depth-First Search – DFS) – процедура посещения всех вершин графа начиная с заданного узла v  Сперва посещаем (обрабатываем) все самые “глубокие” вершины function DFS(v) visited[v] = true // Обрабатываем данные вершины v for each u in Adj(v) do // Перебор смежных вершин if visited[u] = false then DFS(u) // Рекурсивно обрабатываем вершину u end if end for end function
  • 19. Поиск в глубину (Depth-First Search, DFS) 19  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 20. Поиск в глубину (Depth-First Search, DFS) 20  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 21. Поиск в глубину (Depth-First Search, DFS) 21  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 22. Поиск в глубину (Depth-First Search, DFS) 22  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 23. Поиск в глубину (Depth-First Search, DFS) 23  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)  Все смежные вершины узла 5 посещены  Возвращаемся к узлу 3
  • 24. Поиск в глубину (Depth-First Search, DFS) 24  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 25. Поиск в глубину (Depth-First Search, DFS) 25  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 26. Поиск в глубину (Depth-First Search, DFS) 26  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)  Все смежные вершины узла 6 посещены  Возвращаемся к узлу 7, затем к 8
  • 27. Поиск в глубину (Depth-First Search, DFS) 27  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 28. Поиск в глубину (Depth-First Search, DFS) 28  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 29. Поиск в ширину (Breadth-First Search, BFS) 29  Поиск в ширину (Breadth-First Search – BFS, обход в ширину) – процедура посещения всех вершин графа начиная с заданного узла v  Сперва посещаем (обрабатываем) свои дочерние вершины
  • 30. function BFS(v) visited[v] = true // Обрабатываем вершину v QueueEnqueue(v) // Помещаем v в очередь вершин while QueueSize() > 0 do u = QueueDequeue() // Извлекаем вершину for each x in Adj(u) do if visited[x] = false then QueueEnqueue(x) visited[x] = true // Обрабатываем узел x end if end for end while end function Поиск в ширину (Breadth-First Search, BFS) 30
  • 31. Поиск в ширину (Breadth-First Search, BFS) 31  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 2  В очереди: 1, 3, 5  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 32. Поиск в ширину (Breadth-First Search, BFS) 32  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 1  В очереди: 3, 5, 4  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 33. Поиск в ширину (Breadth-First Search, BFS) 33  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 3  В очереди: 5, 4, 8  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 34. Поиск в ширину (Breadth-First Search, BFS) 34  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 5  В очереди: 4, 8  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 35. Поиск в ширину (Breadth-First Search, BFS) 35  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 4  В очереди: 8, 6  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 36. Поиск в ширину (Breadth-First Search, BFS) 36  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 8  В очереди: 6, 7, 9, 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 37. Поиск в ширину (Breadth-First Search, BFS) 37  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 6  В очереди: 7, 9, 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 38. Поиск в ширину (Breadth-First Search, BFS) 38  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 7  В очереди: 9, 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 39. Поиск в ширину (Breadth-First Search, BFS) 39  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 9  В очереди: 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 40. Поиск в ширину (Breadth-First Search, BFS) 40  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 10  В очереди:  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 41. Реализация графа на базе матрицы смежности 41 #include <stdio.h> #include <stdlib.h> #include "queue_array.h" struct graph { int nvertices; /* Число вершин */ int *m; /* Матрица n x n */ int *visited; };
  • 42. struct graph *graph_create(int nvertices) { struct graph *g; g = malloc(sizeof(*g)); g->nvertices = nvertices; g->visited = malloc(sizeof(int) * nvertices); g->m = malloc(sizeof(int) * nvertices * nvertices); graph_clear(g); // Опционально, O(n^2) return g; } Реализация графа на базе матрицы смежности 42 TCreate = O(n2) Memory = O(n2)
  • 43. Реализация графа на базе матрицы смежности 43 void graph_clear(struct graph *g) { int i, j; for (i = 0; i < g->nvertices; i++) { g->visited[i] = 0; for (j = 0; j < g->nvertices; j++) { g->m[i * g->nvertices + j] = 0; } } } TClear = O(n2)
  • 44. Реализация графа на базе матрицы смежности 44 void graph_free(struct graph *g) { free(g->m); free(g); }
  • 45. /* * graph_set_edge: Назначает ребру (i, j) вес w * i, j = 1, 2, ..., n */ void graph_set_edge(struct graph *g, int i, int j, int w) { g->m[(i - 1) * g->nvertices + j - 1] = w; g->m[(j - 1) * g->nvertices + i - 1] = w; } int graph_get_edge(struct graph *g, int i, int j) { return g->m[(i - 1) * g->nvertices + j - 1]; } Реализация графа на базе матрицы смежности 45
  • 46. void graph_dfs(struct graph *g, int v) { int i; g->visited[v - 1] = 1; printf("Vertex %dn", v); for (i = 0; i < g->nvertices; i++) { if (g->m[(v - 1) * g->nvertices + i] > 0 && g->visited[i] == 0) { graph_dfs(g, i + 1); } } } Обход графа в глубину (DFS) – рекурсивная версия 46 TDFS = O(n2)
  • 47. Обход графа в ширину (BFS) 47 void graph_bfs(struct graph *g, int v) { int i, j; struct queue *q; for (i = 0; i < g->nvertices; i++) g->visited[i] = 0; // Создаем очередь q = queue_create(g->nvertices); // Обрабатываем стартовую вершину g->visited[v - 1] = 1; printf("Vertex %dn", v); queue_enqueue(q, v - 1);
  • 48. Обход графа в ширину (BFS, продолжение) 48 while (queue_size(q) > 0) { i = queue_dequeue(q); for (j = 0; j < g->nvertices; j++) { if (g->m[i * g->nvertices + j] > 0 && g->visited[j] == 0) { queue_enqueue(q, j); g->visited[j] = 1; printf("Vertex %dn", j + 1); } } } queue_free(q); } TBFS = O(n2)
  • 49. Пример 49 int main() { struct graph *g; g = graph_create(10); graph_set_edge(g, 1, 2, 1); graph_set_edge(g, 1, 4, 1); /* ... */ printf("DFS:n"); graph_dfs(g, 2); printf("BFS:n"); graph_bfs(g, 2); graph_free(g); return 0; }
  • 50. Домашнее чтение 50  Разобрать доказательство вычислительной сложности процедур BFS и DFS [Aho, C. 217], [CLRS, С. 613, С. 622]  Прочитать про формат хранения графов в сжатом виде  Compressed Sparse Row Graph (CSR) http://www.boost.org/doc/libs/1_45_0/libs/graph/doc/compr essed_sparse_row.html  Sparse matrix http://en.wikipedia.org/wiki/Sparse_matrix