SlideShare uma empresa Scribd logo
1 de 50
Baixar para ler offline
Лекция 8
Графы. Обходы графов
Курносов Михаил Георгиевич
E-mail: mkurnosov@gmail.com
WWW: www.mkurnosov.net
Курс «Структуры и алгоритмы обработки данных»
Сибирский государственный университет телекоммуникаций и информатики (Новосибирск)
Весенний семестр, 2015
Понятие графа
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)
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)
19
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
20
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
21
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
22
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
23
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
 Все смежные вершины
узла 5 посещены
 Возвращаемся к узлу 3
Поиск в глубину (depth-first search)
24
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
25
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
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)
27
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в глубину (depth-first search)
28
 Обход в глубину с вершины 2:
DFS(2)
for each u in Adj(2) do
...
end for
 Обход в глубину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в глубину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
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)
30
Поиск в ширину (breadth-first search)
31
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 2
 В очереди:
1, 3, 5
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
32
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 1
 В очереди:
3, 5, 4
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
33
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 3
 В очереди:
5, 4, 8
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
34
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 5
 В очереди:
4, 8
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
35
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 4
 В очереди:
8, 6
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
36
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 8
 В очереди:
6, 7, 9, 10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
37
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 6
 В очереди:
7, 9, 10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
38
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 7
 В очереди:
9, 10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
39
 Обход в ширину с вершины 2: BFS(2)
 Извлекли из очереди: 9
 В очереди:
10
 Обход в ширину графа,
представленного матрицей смежности,
имеет трудоемкость O(|V|2)
 Обход в ширину графа, представленного
списком смежности, имеет
трудоемкость O(|V| + |E|)
Поиск в ширину (breadth-first search)
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, С. 630, С. 639]
 Прочитать про формат хранения графов в сжатом виде
 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

Mais conteúdo relacionado

Mais procurados

лекция 2. острые респираторные заболевания у детей
лекция 2. острые респираторные заболевания у детейлекция 2. острые респираторные заболевания у детей
лекция 2. острые респираторные заболевания у детей
fktirf27
 
заемна положба на графиците на некои линеарни функции активности
заемна положба на графиците на некои линеарни функции активностизаемна положба на графиците на некои линеарни функции активности
заемна положба на графиците на некои линеарни функции активности
Sneze Zlatkovska
 
6 задачі на пропорційний поділ модягіна
6 задачі на пропорційний поділ модягіна6 задачі на пропорційний поділ модягіна
6 задачі на пропорційний поділ модягіна
daniil chilochi
 
системы счисления
системы счислениясистемы счисления
системы счисления
zhu4ka
 

Mais procurados (20)

Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & Streams
 
18. Java associative arrays
18. Java associative arrays18. Java associative arrays
18. Java associative arrays
 
Object Calisthenics Applied to PHP
Object Calisthenics Applied to PHPObject Calisthenics Applied to PHP
Object Calisthenics Applied to PHP
 
нейро снід
нейро сніднейро снід
нейро снід
 
лекция 2. острые респираторные заболевания у детей
лекция 2. острые респираторные заболевания у детейлекция 2. острые респираторные заболевания у детей
лекция 2. острые респираторные заболевания у детей
 
заемна положба на графиците на некои линеарни функции активности
заемна положба на графиците на некои линеарни функции активностизаемна положба на графиците на некои линеарни функции активности
заемна положба на графиците на некои линеарни функции активности
 
6 задачі на пропорційний поділ модягіна
6 задачі на пропорційний поділ модягіна6 задачі на пропорційний поділ модягіна
6 задачі на пропорційний поділ модягіна
 
Idiomatic Kotlin
Idiomatic KotlinIdiomatic Kotlin
Idiomatic Kotlin
 
Lab manual data structure (cs305 rgpv) (usefulsearch.org) (useful search)
Lab manual data structure (cs305 rgpv) (usefulsearch.org)  (useful search)Lab manual data structure (cs305 rgpv) (usefulsearch.org)  (useful search)
Lab manual data structure (cs305 rgpv) (usefulsearch.org) (useful search)
 
PHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object CalisthenicsPHP for Adults: Clean Code and Object Calisthenics
PHP for Adults: Clean Code and Object Calisthenics
 
17. Java data structures trees representation and traversal
17. Java data structures trees representation and traversal17. Java data structures trees representation and traversal
17. Java data structures trees representation and traversal
 
Інтеграл та його застосування
Інтеграл та його застосуванняІнтеграл та його застосування
Інтеграл та його застосування
 
системы счисления
системы счислениясистемы счисления
системы счисления
 
The Functional Programming Triad of Map, Filter and Fold
The Functional Programming Triad of Map, Filter and FoldThe Functional Programming Triad of Map, Filter and Fold
The Functional Programming Triad of Map, Filter and Fold
 
Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017
 
Числові характеристики
Числові характеристикиЧислові характеристики
Числові характеристики
 
герх
герхгерх
герх
 
Хвороба Крона та неспецифічний виразковий коліт
Хвороба Крона та неспецифічний виразковий колітХвороба Крона та неспецифічний виразковий коліт
Хвороба Крона та неспецифічний виразковий коліт
 
11. Java Objects and classes
11. Java  Objects and classes11. Java  Objects and classes
11. Java Objects and classes
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
 

Destaque

Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
Mikhail Kurnosov
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
Mikhail Kurnosov
 

Destaque (20)

Лекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировкаЛекция 7. Бинарные кучи. Пирамидальная сортировка
Лекция 7. Бинарные кучи. Пирамидальная сортировка
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
Лекция 12. Вероятностный анализ и рандомизированные алгоритмы (Randomized al...
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Лекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графеЛекция 9. Поиск кратчайшего пути в графе
Лекция 9. Поиск кратчайшего пути в графе
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Лекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поискаЛекция 5. Бинарные деревья поиска
Лекция 5. Бинарные деревья поиска
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
Лекция 8. Деревья разбиения пространства (BSP tree, k-d tree, quadtree)
 
Лекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимостиЛекция 10: Графы. Остовные деревья минимальной стоимости
Лекция 10: Графы. Остовные деревья минимальной стоимости
 
Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)Лекция 4. Префиксные деревья (Tries, prefix trees)
Лекция 4. Префиксные деревья (Tries, prefix trees)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)Лекция 10. Биномиальные кучи (Binomial heaps)
Лекция 10. Биномиальные кучи (Binomial heaps)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 

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

Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Nikolay Grebenshikov
 
практика 13
практика 13практика 13
практика 13
student_kai
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графах
Mikhail Kurnosov
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
Транслируем.бел
 
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Nikolay Grebenshikov
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
2berkas
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
Mikhail Kurnosov
 
задания государственного экзамена по математике 15
задания государственного экзамена по математике 15задания государственного экзамена по математике 15
задания государственного экзамена по математике 15
svetlana
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Mikhail Kurnosov
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Mikhail Kurnosov
 

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

Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
 
практика 13
практика 13практика 13
практика 13
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графах
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
лекция 6
лекция 6лекция 6
лекция 6
 
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивыКомпьютерная графика в Processing, часть 2. Основные 2D-примитивы
Компьютерная графика в Processing, часть 2. Основные 2D-примитивы
 
9893
98939893
9893
 
задания государственного экзамена по математике 15
задания государственного экзамена по математике 15задания государственного экзамена по математике 15
задания государственного экзамена по математике 15
 
Chjotnye i nechjotnye_funkcii
Chjotnye i nechjotnye_funkciiChjotnye i nechjotnye_funkcii
Chjotnye i nechjotnye_funkcii
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Урок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". КлассыУрок 4. "Завязывание узлов". Классы
Урок 4. "Завязывание узлов". Классы
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Clojure #1
Clojure #1Clojure #1
Clojure #1
 
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
 
6.0a
6.0a6.0a
6.0a
 

Mais de Mikhail Kurnosov

Mais de Mikhail Kurnosov (20)

Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
Лекция 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...
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 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)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция 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. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимостиЛекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 10. Графы. Остовные деревья минимальной стоимости
 
Семинар 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. Хеш-таблицы
 

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

  • 1. Лекция 8 Графы. Обходы графов Курносов Михаил Георгиевич E-mail: mkurnosov@gmail.com WWW: www.mkurnosov.net Курс «Структуры и алгоритмы обработки данных» Сибирский государственный университет телекоммуникаций и информатики (Новосибирск) Весенний семестр, 2015
  • 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) 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) 19  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 20. Поиск в глубину (depth-first search) 20  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 21. Поиск в глубину (depth-first search) 21  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 22. Поиск в глубину (depth-first search) 22  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 23. Поиск в глубину (depth-first search) 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) 24  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 25. Поиск в глубину (depth-first search) 25  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 26. Поиск в глубину (depth-first search) 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) 27  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 28. Поиск в глубину (depth-first search) 28  Обход в глубину с вершины 2: DFS(2) for each u in Adj(2) do ... end for  Обход в глубину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в глубину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 29. Поиск в ширину (breadth-first search) 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) 30
  • 31. Поиск в ширину (breadth-first search) 31  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 2  В очереди: 1, 3, 5  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 32. Поиск в ширину (breadth-first search) 32  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 1  В очереди: 3, 5, 4  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 33. Поиск в ширину (breadth-first search) 33  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 3  В очереди: 5, 4, 8  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 34. Поиск в ширину (breadth-first search) 34  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 5  В очереди: 4, 8  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 35. Поиск в ширину (breadth-first search) 35  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 4  В очереди: 8, 6  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 36. Поиск в ширину (breadth-first search) 36  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 8  В очереди: 6, 7, 9, 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 37. Поиск в ширину (breadth-first search) 37  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 6  В очереди: 7, 9, 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 38. Поиск в ширину (breadth-first search) 38  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 7  В очереди: 9, 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 39. Поиск в ширину (breadth-first search) 39  Обход в ширину с вершины 2: BFS(2)  Извлекли из очереди: 9  В очереди: 10  Обход в ширину графа, представленного матрицей смежности, имеет трудоемкость O(|V|2)  Обход в ширину графа, представленного списком смежности, имеет трудоемкость O(|V| + |E|)
  • 40. Поиск в ширину (breadth-first search) 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, С. 630, С. 639]  Прочитать про формат хранения графов в сжатом виде  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