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

31
Лекция 8: Графы. Обходы графов КурносовМихаил Георгиевич к.т .н. доцент Кафедры вычислительных систем Сибирский государственный университет телекоммуникаций и информатики http://www.mkurnosov.net

Upload: mikhail-kurnosov

Post on 15-Jun-2015

1.336 views

Category:

Education


9 download

TRANSCRIPT

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

Лекция 8:

Графы. Обходы графов

Курносов Михаил Георгиевич

к.т.н. доцент Кафедры вычислительных систем

Сибирский государственный университет

телекоммуникаций и информатики

http://www.mkurnosov.net

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

Контроль

2

1. Какие операции поддерживает очередь с приоритетом

(Priority Queue)?

2. Перечислите известные Вам подходы к реализации

очередей с приоритетами.

3. Что такое двоичная куча (Binary heap)?

4. Что такое сортирующее дерево?

5. Чем отличается max-heap от min-heap?

6. Какова вычислительная сложность в худшем случае

добавления элемента в двоичную кучу?

7. Какова вычислительная сложность в худшем случае

поиска минимального элемента в min-heap?

8. Какова вычислительная сложность в худшем случае

удаления максимального элемента из max-heap?

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

Графы

3

� Граф (graph) – это совокупность непустого

множества V вершин и множества E ребер

G = (V, E),

|V| = n, |E| = m,

V = {1, 2, …, n}, E = {(u1, v1), (u2, v2), …, (um, vm)}

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

Основные определения

4

Графы (graphs)

Неориентированные графы

(Undirected graphs)

Ориентированные графы

(Directed graphs)

(ребра – edges) (дуги – arcs)

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

Основные определения

5

Вершина (vertex, node)

Смежные вершины

(adjacent vertices)

Ребро (4, 6) инцидентно

(incident) вершинам 4 и 6

Ребро (edge, link)

Путь (path) –

последовательность вершин,

в которой следующая вершина

(после первой) является смежной

с предыдущей – все вершины и

ребра различны: (10, 8, 3, 5)

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

Основные определения

6

Цикл (cycle) – путь, в котором

первая и последняя вершины

совпадают: (4, 6, 7, 8, 3, 4)

Степень вершины

(vertex degree) – количество

ребер, инцидентных вершине

deg(7) = 2, deg(1) = 3

Связный граф

(connected graph) – граф,

в котором существует путь из

каждой вершины в любую другую

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

Основные определения

7

� Взвешенный граф (weighted graph) – граф, ребрами

(дугам) которого назначены веса

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

Основные определения

8

Полный граф (complete graph) –

граф, в котором каждая пара

различных вершин смежна.

Количество ребер в полном графе:

� = �(� − 1)2

Насыщенность D графа (density):

= 2��(� − 1)

У полного графа насыщенность D = 1

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

Основные определения

9

Насыщенный граф (dense graph) –

граф, в котором количество ребер

близко к максимально возможному

|E| = O(|V|2)

= (2 ∙ 19)/(7 ∙ 6) = 0.9

Разреженный граф (sparse graph) –

граф, в котором количество ребер

близко к количеству вершин в графе

|E| = O(|V|)

= (2 ∙ 7)/(7 ∙ 6) = 0.33

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

Представление графов в памяти

10

� Представление графа в памяти (формат его хранения)

определяет вычислительную сложность операций над

графом и объем требуемой памяти

� Основные способы представления графов в памяти:

o матрица смежности (adjacency matrix) –

эффективна для насыщенных графов

o список смежных вершин (adjacency list) –

эффективен для разреженных графов

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

Матрица смежности

11

� Матрица A смежности

(adjacency matrix) – матрица n × n

элементовв которой

��� = �1, если �, � ∈ �,0, иначе.

� Объем требуемой памяти:O(|V|2)

� Быстрое определение имеется

ли ребро (u, v) в графе

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

Матрица смежности

12

Какого размера граф можно разместить в оперативной

памяти объемом 4 Гб использую матрицу смежности?

int a[n][n];

� sizeof(int) = 4 байта

� 4 Гб = 4 ∙ 230 байт

� 4 ∙ 230 / 4 = 230 – можно разместить 230 элементов типа int

� � = 2#$ = 32768 – количество строки и столбцов

Надо учесть, что часть памяти занята ОС

и другими программами

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

Список смежных вершин

13

� Список смежных вершин

(adjacency list) – это массив A[n], каждый

элемент A[i] которого содержит список

смежных с вершиной i узлов.

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

Список смежных вершин

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:

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

/* Обход смежных вершин узла i */

for (j = A[i]; j < A[i + 1]; j++) {

v = L[j];

}

Список смежных вершин

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:

� Количество смежных узлов вершины i: A[i + 1] – A[i]

Ошибка из-за петли!

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

Обход графа (Graph traversal)

16

� Обход графа (Graph traversal) – это процедура перебора

(посещения) всех вершин

Граф

социальной

сети

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

function DFS(v)

visited[v] = true

/* Обрабатываем данные вершины v ... */

for each u in Adj(v) do

if visited[u] = false then

DFS(u)

end if

end for

end function

Поиск в глубину (Depth-First Search )

17

� Поиск в глубину (Depth-First Search – DFS, обход в

глубину) – процедура посещения всех вершин графа

(или пока не будет найдена искомая)

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

Поиск в глубину (обход в глубину)

18

� Обход в глубину с вершины 2:

DFS(2)

for each u in Adj(2) do

...

end for

� Обход в глубину графа,

представленного матрицей смежности,

имеет трудоемкость O(|V|2)

� Обход в глубину графа, представленного

списком смежности, имеет

трудоемкость O(|V| + |E|)

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

Поиск в ширину (обход в ширину)

19

� Поиск в ширину (Breadth-First Search – BFS, обход в

ширину) – процедура посещения всех вершин графа

(или пока не будет найдена искомая)

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

function BFS(v)

visited[v] = true

/* Обрабатываем v */

QueueEnqueue(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 )

20

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

Поиск в ширину (обход в ширину)

21

� Обход в ширину с вершины 2:

BFS(2)

o Queue: 1, 3, 5

o Queue: 3, 5, 4

o Queue: 5, 4, 8

o …

� Обход в ширину графа,

представленного матрицей смежности,

имеет трудоемкость O(|V|2)

� Обход в ширину графа, представленного

списком смежности, имеет

трудоемкость O(|V| + |E|)

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

Реализация графа на базе матрицы смежности

22

#include <stdio.h>

#include <stdlib.h>

#include "queue_array.h"

struct graph {

int nvertices;

int *m; /* Матрица n x n */

int *visited;

};

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

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);

return g;

}

Реализация графа на базе матрицы смежности

23TCreate = O(n2) Memory = O(n2)

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

Реализация графа на базе матрицы смежности

24

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)

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

Реализация графа на базе матрицы смежности

25

void graph_free(struct graph *g)

{

free(g->m);

free(g);

}

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

/*

* 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];

}

Реализация графа на базе матрицы смежности

26

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

void graph_dfs(struct graph *g, int v)

{

int i;

g->visited[v - 1] = 1;

printf("Vertex %d\n", 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) – рекурсивная версия

27

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

Обход графа в ширину (BFS)

28

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 %d\n", v);

queue_enqueue(q, v - 1);

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

Обход графа в ширину (BFS, продолжение)

29

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 %d\n", j + 1);

}

}

}

queue_free(q);

}

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

Пример

30

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;

}

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

Задание

31

� Прочитать о доказательстве вычислительной сложности

процедур BFS и DFS (Aho, Sedgewick-p5, Cormen).