Seminrio sobre Busca em Grafos Antonio Dirceu Rabelo
Seminário sobre Busca em Grafos. . . . Antonio Dirceu Rabelo de Vasconcelos Filho Roberta Beltrão Correia Lima
Busca em Grafos - Tópicos u u u u Introdução Grafos x Árvores Processo Geral Busca em Profundidade Busca em Largura Grafos Não-Conexos Complexidade
Introdução u u O que é um grafo? Qual o objetivo da busca em grafos?
Grafos x Árvores u Quando o grafo é uma árvore o problema da busca se torna simples, pois existe uma ordem “natural” para percorrê-lo, uma vez que eles são claramente divididos em raiz, sub-árvore da esquerda e sub-árvore da direita. F A B D C E
Grafos x Árvores u u u A Para caminhar em uma árvore temos quatro tipos de busca: Pre-Order (Pre-Ordem); In-Order (Central); Pos-Order (Pós-Ordem); Por Nível. B D F C E
Grafos x Árvores u u A Pre-Order (Pre-Ordem): 1º. Visita a raiz; 2º. Percorre a sub-árvore da esquerda; 3º. Percorre a sub-árvore da direita. B D F C E
Grafos x Árvores u u A In-Order (Central): 1º. Percorre a sub-árvore da esquerda; 2º. Visita a raiz; 3º. Percorre a sub-árvore da direita. B D F C E
Grafos x Árvores u u A Pos-Order (Pós-Ordem): 1º. Percorre a sub-árvore da esquerda; 2º. Percorre a sub-árvore da direita. 3º. Visita a raiz; B D F C E
Grafos x Árvores u u A Por Nível: B Percorre-se um nível de cada vez, sendo cada nível percorrido da esquerda para a direita. D F C E
Grafos x Árvores Ex. : u u Pre-Order: A B D F E G H I K J C In-Order: F D B G E I K H J A C Pos-Order: F D G K I J H E B C A Por Nível: A B C D E F G H I J K
Grafos x Árvores u Quando o grafo não tiver a propriedade de árvore não há um referencial geral a ser considerado, ou seja , não são definidos conceitos de esquerda, direita e nível. Assim o processo de busca se torna mais difícil.
Grafos x Árvores Desse modo surgem as perguntas: u Como caminhar no grafo de modo a visitar todos os vértices e arestas, evitando, contudo, repetições desnecessárias? u Como definir um caminhamento sistemático no grafo, de modo que fique determinado qual o vértice a ser visitado na seqüência de visitas?
Processo Geral u Seja G um grafo no qual todos os vértices estão inicialmente desmarcados. u Inicialmente, marca-se como visitado um vértice v escolhido arbitrariamente. Esse vértice inicial é chamado de raiz de busca. u Seleciona-se uma aresta que parte de algum vértice já marcado v. Marca-se então a aresta (v, w) como explorada e o vértice w como visitado (caso ainda não o seja). u O processo termina quando todas as arestas de G tiverem sido selecionadas.
Processo Geral Algoritmo de busca geral: Dados: grafo G (V, E) A Escolher e marcar um vértice inicial Enquanto existir algum vértice v marcado e incidente a uma aresta (v, w) não explorada, faça explorar a aresta (v, w) se w é não marcado então marcar w D C B E
Processo Geral Note que durante o processo de exploração de um vértice é possível que ele seja alcançado diversas vezes (tantas quantas forem o número de arestas incidentes). Nos critérios de busca em profundidade e busca em largura, que veremos a seguir, a escolha do próximo vértice torna-se única, mas para os casos do vértice inicial e aresta incidente a escolha permanece arbitrária.
Busca em Profundidade (Depth-First Search) u Dentre todos os vértices marcados e incidentes a alguma aresta ainda não explorada, escolher aquele mais recentemente alcançado na busca. u Um detalhe importante é que usamos o auxílio de uma pilha para guardar os vértices já marcados.
Busca em Profundidade (Depth-First Search) Procedimento P (v, pai) marcar v; colocar v na pilha Q; para toda aresta ( v, w) faça se w é não marcado então visitar (v, w); marcar (v, w) como aresta de árvore; P(w, v); senão se w pai então visitar (v, w); marcar (v, w) como aresta de retorno; senão visitar (v, w); marcar (v, w) como aresta de árvore; retirar v da pilha fim_do_procedimento Ex. 3 1 6 2 4 5
Busca em Profundidade (Depth-First Search) O algoritmo particiona as arestas em: u Arestas de Árvore; u Arestas de Retorno. u As arestas de árvore constituem uma árvore geradora de G. u As arestas de retorno, cada uma por sua vez, liga um vértice v a um ancestral seu.
Busca em Profundidade (Depth-First Search) Ex. : Criar duas diferentes árvores geradoras para o grafo abaixo: v 5 v 4 v 6 v 3 v 1 v 2
Busca em Largura (Breadth-First Search) u Dentre todos os vértices marcados e incidentes a alguma aresta ainda não explorada, escolher aquele menos recentemente alcançado na busca. u Um detalhe importante é que usamos o auxílio de uma fila para guardar os vértices já marcados.
Busca em Largura (Breadth-First Search) Procedimento L (v, pai) marcar v; colocar v na fila Q; enquanto a fila Q não for vazia faça remover o 1º vértice w da fila; para todo (w, x) faça se x é não marcado então marque x; adicione (w, x) à árvore T; coloque x na fila Q; fim_do_procedimento Ex. 3 1 6 2 4 5
Grafos não-conexos u No caso do grafo não ser conexo o algoritmo de busca (profundidade ou largura) terá apenas uma modificação e seguirá o seguinte critério: u Executa-se o algoritmo a partir de um vértice v qualquer. Se ao término do procedimento restar algum vértice do grafo G não marcado repete-se o procedimento para este vértice. Ex. : a e f c b d h g i
Complexidade u Nos dois algoritmos de busca (largura e profundidade) observamos que cada aresta é visitada exatamente duas vezes (uma para cada vértice). Portanto o tempo de execução depende do número de arestas. u Quando o grafo é não-conexo, temos que analisar os vértices que não estão conectados a ninguém. Assim, o tempo de execução também depende do nº de vértices. u Conclusão: Para um grafo G (V, E) os algoritmos de busca em largura e em profundidade tem complexidade O ( |V| + |E|)
Conclusão. . . .
- Slides: 24