Estruturas de representação
Download
Report
Transcript Estruturas de representação
Algoritmos em Grafos
Formas de representação e manipulação básica
Prof. André Renato
1º Semestre / 2012
Estrutura de dados
Relembrando: um grafo é um conjunto de
vértices interconectados por arestas.
Existem, portanto, dois tipos de
informações a serem armazenadas na
memória do computador.
O objetivo de toda estrutura de dados é
armazenar informações da forma mais
eficiente possível.
O que é ser eficiente????
Estrutura de dados
Em computação, o termo eficiência é
muito abrangente, podendo significar
coisas distintas e, por vezes, antagônicas:
◦
◦
◦
◦
Tempo computacional
Espaço de memória
Poucas linhas de código
Algoritmo de fácil compreensão
Estrutura de dados
Para cada objetivo, normalmente, é
possível propor uma estrutura e dados
otimizada.
Portanto, a grande pergunta fica: qual a
melhor estrutura para um grafo?
Difícil responder sem conhecer o grafo e
sua aplicação principal.
É muito comum cada aplicação distinta
funcionar melhor com estruturas
diferentes.
Estruturas de dados
Existem, tradicionalmente, duas estruturas
mais comuns que são utilizadas para se
resolver os problemas mais clássicos
relacionados a grafos.
◦ Matriz de adjacências
◦ Lista de adjacências
Matriz de adjacências
Consiste em construir uma matriz R =
(rij) de tamanho n x n tal que:
◦ rij = 1,se e somente se (i,j) E;
◦ rij = 0, caso contrário;
1
2
3
4
5
1
2
3
4
5
12345
01100
10101
11011
00100
01100
Matriz de adjacências
Cada matriz representa um único grafo
(não há ambiguidade) e pode ser
manipulada facilmente pelo computador.
Características:
◦ É simétrica para grafos não-direcionados;
◦ A quantidade de “1” é igual ao dobro de
arestas;
◦ Consome O(n2) de memória;
Matriz de adjacências
Para grafos direcionados, a matriz deixa
de ser simétrica, pois a existência de uma
conexão partindo de um vértice i e
chegando a um vértice j não implica na
situação contrária;
Para grafos ponderados, pode-se
substituir o valor “1” pelo peso da
respectiva aresta;
Matriz de adjacências
A representação por matriz apresenta
uma interessante relação com o problema
de isomorfismo:
Uma matriz representa um único grafo,
como já foi dito, mas um grafo pode ser
representado por diversas matrizes:
Matriz de adjacências
Exemplo:
1
2
3
4
1
2
3
4
5
12345
01100
10101
11011
00100
01100
5
1
3
2
4
5
13245
01100
10111
11001
01000
01100
2
5
3
4
1
25341
01101
10100
11011
00100
10100
Matriz de adjacências
O exemplo pode não fazer sentido
quando os vértices são representados por
números. Não temos motivos pensar no
vértice 3 posicionado na linha 5, ou o
vértice 1 na segunda linha.
Porém, nem todos os vértices são
representados por números. Em algumas
situações ele podem ser representados
por nomes (grafos rotulados).
Matriz de adjacências
Exemplo:
Venezuela
Colômbia
Brasil
Uruguai
Ven
Peru
Col.
Brasil
Uru.
Ven. Peru Col. Brasil Uru.
0
0 1
1
0
0
0 1
1
0
1
1 0
1
0
1
1 1
0
1
0
0 0
1
0
Como criar uma matriz assim?
Peru
Col.
Brasil
Peru
Ven.
Uru.
Col. Brasil Peru Ven. Uru.
0
1
1 1 0
1
0
1 1 1
1
1
0 0 0
1
1
0 0 0
0
1
0 0 0
Matriz de adjacências
Como diversas matrizes podem
representar um único grafo, o problema
de isomorfismo pode ser enunciado de
outra forma:
◦ Dadas duas matrizes de adjacências R1 e R2,
representam elas o mesmo grafo?
◦ Como solucionar????
Lista de adjacências
Nesta forma de representação, existe uma
lista principal contendo todos os vértices
do grafo.
Cada elemento da lista principal contém
uma nova lista indicando quais são os
vértices adjacentes ao vértice em
questão.
Lista de adjacências
Exemplo:
1
2
3
4
5
1
2
3
2
1
3
5
3
1
2
4
4
3
5
2
3
5
Lista de adjacências
Para grafos direcionados, a informação
sobre a existência da aresta não estará
duplicada;
Para grafos ponderados, deve-se
acrescentar um campo a mais em cada
elemento das listas, indicando o peso da
aresta;
Em grafos rotulados, deve-se acrescentar
aos elementos da lista principal o nome
do vértice;
Lista de adjacências
O consumo de memória deve levar em
conta a lista principal e as demais;
Logo, temos O(n) para a lista principal e
O(m) para as demais listas;
O consume de memória é O(n+m).
O que acontece se o grafo for
completo???
Lista x Matriz
O principal fator determinante na escolha
da representação é a quantidade de
arestas do grafo.
Esta característica é chamada de
esparsidade do grafo.
Grafos esparsos devem utilizar lista de
adjacências e grafos densos, matrizes.
Como determinar a esparsidade???
Resumo
Representação
Lista
Matriz
Indicação
Grafos esparsos
Grafos densos
Memória
O(n+m)
O(n2)
Rótulos
Na própria lista
Em outra estrutura
Pesos das arestas
Na própria lista
Na própria matriz
Pesos dos vértices
Na própria lista
Em outra estrutura*
Exercícios
Determinar a complexidade de:
A. Descobrir se existe adjacência (i,j)
B. Descobrir se um vértice é desconexo
C. Descobrir o grau de um vértice (nãodirecionado)
D. Descobrir o grau de entrada de um vértice
E. Descobrir o grau de saída de um vértice
F. Adicionar/remover uma aresta
G. Adicionar/remover um vértice