200 likes | 409 Vues
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.
E N D
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 1 2 3 4 5 1 0 1 1 0 0 2 1 0 1 0 1 3 1 1 0 1 1 4 0 0 1 0 0 5 0 1 1 0 0 3 4 5
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 5 1 2 3 4 5 1 0 1 1 0 0 2 1 0 1 0 1 3 1 1 0 1 1 4 0 0 1 0 0 5 0 1 1 0 0 1 3 2 4 5 1 0 1 1 0 0 3 1 0 1 1 1 2 1 1 0 0 1 4 0 1 0 0 0 5 0 1 1 0 0 2 5 3 4 1 2 0 1 1 0 1 5 1 0 1 0 0 3 1 1 0 1 1 4 0 0 1 0 0 1 1 0 1 0 0
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 Peru Ven. Peru Col. Brasil Uru. Ven 0 0 1 1 0 Peru 0 0 1 1 0 Col. 1 1 0 1 0 Brasil 1 1 1 0 1 Uru. 0 0 0 1 0 Col. Brasil Peru Ven. Uru. Col. 0 1 1 1 0 Brasil 1 0 1 1 1 Peru 1 1 0 0 0 Ven. 1 1 0 0 0 Uru. 0 1 0 0 0 Como criar uma matriz assim?
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 1 2 2 1 3 5 3 3 1 2 4 5 4 5 4 3 5 2 3
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???
Exercícios • Determinar a complexidade de: • Descobrir se existe adjacência (i,j) • Descobrir se um vértice é desconexo • Descobrir o grau de um vértice (não-direcionado) • Descobrir o grau de entrada de um vértice • Descobrir o grau de saída de um vértice • Adicionar/remover uma aresta • Adicionar/remover um vértice