• Nenhum resultado encontrado

Grafos-07

N/A
N/A
Protected

Academic year: 2021

Share "Grafos-07"

Copied!
43
0
0

Texto

(1)

Busca em Profundidade

“O Senhor olha dos céus para os filhos dos homens,

para ver se há alguém que tenha entendimento, alguém que busque a Deus.”

(2)

Busca em Grafos (Revisão)

• Buscas (ou buscas) em grafos são estratégias algorítmicas usadas para percorrer um grafo

– Seguem/respeitam as arestas

• Duas buscas mais simples

– Busca em extensão (já vimos) – Busca em profundidade (hoje!)

(3)

Motivações para a Busca em

Pronfundidade

• Vamos citar duas aplicações potencias da DFS

• Problema 1: Dado um grafo de amizades, encontrar comunidades/grupos de pessoas interligadas (direta ou indiretamente)

• Em grafos não-direcionados: achar componentes conectados do grafo

(4)

Motivações para a DFS

• Problema 2: Ao criar o currículo de um

curso, com várias disciplinas que podem estar inter-relacionadas por restrições de

“pré-requisito”, é importante verificar se não há uma dependência cíclica. Exemplo:

– MD2 é pré-requisito de Algoritmos

– Algoritmos é pré-requisito de Programação 2 – Programação 2 é pré-requisito de MD2

(5)
(6)

Busca em Profundidade

• Tenta seguir sempre o mais “fundo” possível • Ao chegar em um vértice u, escolhe um

vizinho branco qualquer e já inicia uma visita a ele

(7)

Busca em Profundidade

• Cada vértice pode estar em três estados

– Branco: não-visitado – Cinza: visita iniciada – Preto: visita terminada

• O vértice se torna cinza logo que a busca o atinge, e preto quando todos os seus

(8)

Busca em Profundidade

• Pseudocódigo abstrato da visita

DFS-VISIT (vértice u)

atribui cinza a u //inicio da visita a u

para cada v branco de Adj[u] DFS-VISIT(v) //visita v

(9)

Busca em Profundidade

• Melhorando o pseudocódigo

– Atribuir o instante do início da visita (quando o vértice se torna cinza)

– Atribuir o instante do fim da visita (quando o vértice se torna preto)

– Guardar a árvore de busca (mostra os caminhos seguidos pela busca partindo do vértice de início)

(10)

Busca em Profundidade

• Vamos usar as seguintes variáveis

– cor[u] – conforme explicado anteriormente – i[u] – momento em que a visita a u é iniciada – f[u] – momento em quea visita a u é finalizada

 [u] ou ante[u] – vértice antecessor de u na busca

• Para setar i[] e f[], vamos usar uma variável global tempo

(11)

Pseudocódigo – Visita

• Com as variáveis anteriores

DFS-VISIT(grafo G, vértice u)

cor[u] = CINZA; i[u] = tempo ++;

para cada v de Adj[u] if cor[v] = BRANCO ante[v] = u;

DFS-VISIT(G,v); cor[u] = PRETO;

(12)

Busca em Profundidade

• Quem faz a primeira chamada? Quando as variáveis são inicializadas?

• Vamos definir um procedimento DFS-START para o início da busca, em duas versões:

1. início único (em um vértice s)

(13)

Pseudocódigo – Início Único

• Faz apenas um início da busca, em um dado vértice s

DFS-START(grafo G, vértice s)

para todo vértice v cor[v] = BRANCO i[v] = f[v] = -1 ante[v] = -1

tempo = 1

(14)

Pseudocódigo – Com Reinícios

• Faz novos inícios da busca, enquanto houver vértice branco (não-visitado)

DFS-START(grafo G)

para todo vértice v cor[v] = BRANCO i[v] = f[v] = -1 ante[v] = -1

tempo = 1

(15)

Exemplo

1 4 2 5 3 6 1/12 4/5 2/11 3/10 6/9 7/8

• Uma possível execução da busca, mostrando os tempos i/f de cada vértice

(16)

Saídas

• Por enquanto, as principais saídas do algoritmo são os arrays:

– ante[] – i[] e f[]

• Veremos algumas propriedades associadas a essas arrays, após a execução de uma

(17)
(18)

2.1. Sobre o Array ante[]

• Como na busca em extensão, a busca em profundidade

com início único gera uma árvore

– Cada posição ante[v] guarda o pai (antecessor) de um vértice v

• No exemplo dado antes, a árvore resultante seria esta:

1

2

4

5

(19)

Árvore de Busca

• No caso de início único, esta árvore

representa caminhos quaisquer do vértice de origem s a cada um dos outros vértices • Mas não há garantia de que são mínimos! • Para imprimir um caminho específico, você

pode usar o mesmo algoritmo mostrado para a busca em extensão

(20)

Floresta de Busca

• Se for usada a busca em profundidade

com reinícios, cada reinício gera uma árvore

– Ou seja, a saída é uma floresta (conjunto de árvores)

• Os caminhos representados em cada árvore são pouco úteis

(21)

Voltando ao Problema 1

• Então, como fazer para achar os grupos a partir de um grafo das relações de amizade (de uma rede social, por exemplo)?

(22)

2.2. Sobre os Arrays i[] e f[]

• Definem, para cada nó u, o intervalo de tempo de

busca dele:

[ i[u] ; f[u] ]

• Se w é descendente (direto ou indireto) de u na busca, então o intervalo de w está contido no intervalo de u

– Ou seja: i[u] < i[w] < f[w] < f[u]

– O descendente começa a busca depois e termina antes!

(23)

tempo intervalo de u intervalo de w tempo intervalo de u intervalo de w

Quer que eu desenhe?

• Se w é descendente de u :

• Se não existe relação de

descendência (são de ramos distintos da árvore de busca):

(24)

Estrutura de Parênteses

• A propriedade anterior é chamada estrutura de parênteses, porque uma consequência dela é que a DFS gera parênteses

balanceados, ao fazer assim:

– No início da visita, imprimir “(u” – No final da visita, imprimir “u)”

• Exemplo

– Ordem de visita:

(25)

2.3. Classificação das Arestas

• A busca em profundidade em digrafos induz uma classificação das arestas assim:

– De árvore: formam a árvore de busca (arestas não tracejadas na figura)

– De retorno: leva de volta a um ancestral na árvore de busca

– De adiantamento: “saltam” para um descendente da árvore

– De cruzamento: nós sem relação de descendência

(26)

Voltando ao Problema 2: Detectar

Ciclo

Um digrafo G apresenta algum ciclo

se e somente se

uma busca em profundidade em G produz uma aresta de retorno

(27)
(28)

Motivação

• Problema 3: Dado um currículo com várias disciplinas que podem estar

inter-relacionadas por restrições de “pré-requisito”. Definir uma sequência para completar o

currículo cursando uma disciplina por semestre.

(29)

Representado com Grafos

• Um grafo de dependências (binárias) entre atividades • Um arco (x,y) indica que a

atividade x tem que ser realizada antes de y

• Ordem para realizar uma-a-uma essas atividades todas:

(30)

Ordem Topológica

• Uma ordem topológica é uma ordenação linear dos vértices, tal que

– Para todo arco (x,y) do grafo, o vértice x deve estar posicionado antes do vértice y

• Informalmente:

– “Uma sequência em que todo arco vai da esquerda para a direita”

(31)

Ordem Topológica

• Só existe em grafos acíclicos direcionados (DAGs, em inglês)

– Se tiver ciclo, não é possível satisfazer as dependências!

• É comum haver várias ordens topológicas válidas em um mesmo DAG

• Exemplos de ordens topológicas no grafo anterior:

– 7,5,3,11,8,2,10,9 – 7,5,11,2,3,10,8,9

(32)

Ordenação Topológica

• O problema de achar uma ordem topológica é chamado de ordenação topológica

• Uma pesquisa em profundidade pode calcular uma ordem topológica em um DAG

• Veremos as mudanças nos procedimentos

(33)

Ordenação Topológica

• Mudanças em DFS-VISIT-OT

– Quase igual ao DFS-VISIT padrão – Acessa uma pilha de vértice global

– No final da visita, adiciona o vértice atual na pilha

• Procedimento principal: ORDENA-TOPOLOG

– Quase igual ao DFS-START com reinícios – Inicializa a pilha e a retorna ao final

(34)

Pseudocódigo

• Procedimento principal

ORDENA-TOPOLOG(grafo G)

pilha = []

< igual ao DFS-START com reinícios>

(35)

Pseudocódigo

• Visita

DFS-VISIT-OT(grafo G, vértice u) < igual ao DFS-VISIT >

(36)

Exemplo

(37)

Ordenação Topológica

• Observe que a pilha final contém os vértices em ordem decrescente de f[v]

– O último (fundo) da pilha foi o primeiro finalizado – O primeiro (topo) da pilha foi o último finalizado

• Porém, rodar DFS-START primeiro e ordenar por f[v] posteriormente seria bem menos eficiente

(38)

Esboço da Prova de Corretude

• Resultados básicos

– Um DAG não tem aresta de retorno

• Porque não tem ciclo

– Para toda aresta (x,y), a busca encerra y antes de x

• Na busca, esta aresta é analisada a partir de x • Se y estiver branco, y se tornará filho de x • Se y estiver preto, é porque y já foi encerrado

• (Não pode estar cinza, pois seria aresta de retorno)

– Assim, para toda aresta (x,y), o y é inserido primeiro na pilha

(39)
(40)

Complexidade

• Similar à busca em extensão...

– Inicializa atributos de cada vértice – tempo O(V) – Analisa todas as arestas de saída de cada vértice –

tempo total O(E)

• Assim, a complexidade será O(V+E) ou simplesmente:

(41)

Observações Finais

• A busca em profundidade é uma estratégia algorítmica para percorrer um grafo

• Vimos como, com pequenas alterações,

podemos resolver pelo menos três problemas:

– Achar componentes conectados – Detectar ciclos

– Ordenação topológica

• Veremos outro algoritmo baseado nela na próxima aula...

Referências

Documentos relacionados

Os profissionais da saúde também são afetados por esta instabilidade financeira do país e, diante deste cenário a Sociedade Brasileira de Cirurgia da Mão está organizando

• Idéia: processa os vértices por níveis, começando por aqueles vértices mais próximos do vértice inicial s e deixando os vértices mais distantes para depois.. • Representa um

Arestas de retorno: conectam um vértice u com um antecessor v em uma árvore de busca em profundidade (inclui self-loops).. Arestas de avanço: não pertencem à árvore de busca

I um link left para uma árvore 2-3 que tem chaves menores que a chave do nó e. I um link right para uma árvore 2-3 que tem

O presente trabalho aborda o papel da monitoria de Cálculo Diferencial e Integral I (Cálculo I) na formação dos graduandos em Licenciatura em Matemática, Agroecologia,

Caso você esteja em alguma das situações abaixo, converse com seu médico, pois estas situações apresentam risco especial para possíveis reações anafiláticas

E o gran finale, a maior glória para quem busca o alto rendimento, é mostrada com as imagens do último jogo do Aberto de São Paulo – a grande final entre o argentino Guido Pella e o

Trabalhos têm demonstrado ainda a importância da estimulação de receptores toll-like 2 e 4 (TLR2 e TLR4), receptores de manose (MR) e dectina-1 de fagócitos, tanto