18.01.2014 Views

Busca em largura

Busca em largura

Busca em largura

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

MO417 — Complexidade de Algoritmos I<br />

Cid Carvalho de Souza Cândida Nunes da Silva<br />

Orlando Lee<br />

<strong>Busca</strong>s <strong>em</strong> grafos<br />

16 de maio de 2008<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

<strong>Busca</strong> <strong>em</strong> grafos<br />

Notação<br />

Grafos são estruturas mais complicadas do que listas,<br />

vetores e árvores (binárias).<br />

Precisamos de métodos para explorar/percorrer um grafo<br />

(orientado ou não-orientado).<br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong> (breadth-first search)<br />

<strong>Busca</strong> <strong>em</strong> profundidade (depth-first search)<br />

Pode-se obter várias informações sobre a estrutura do<br />

grafo que pod<strong>em</strong> ser úteis para projetar algoritmos<br />

eficientes para determinados probl<strong>em</strong>as.<br />

Para um grafo G (orientado ou não) denotamos por V[G]<br />

seu conjunto de vértices e por E[G] seu conjunto de<br />

arestas.<br />

Para denotar complexidades nas expressões com O ou Θ<br />

usar<strong>em</strong>os V e E <strong>em</strong> vez de |V[G]| ou |E[G]|. Por ex<strong>em</strong>plo,<br />

Θ(V + E) ou O(V 2 ).<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


<strong>Busca</strong> <strong>em</strong> <strong>largura</strong><br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong><br />

Diz<strong>em</strong>os que um vértice v é alcançável a partir de um<br />

vértice s <strong>em</strong> um grafo G se existe um caminho de s a v <strong>em</strong><br />

G.<br />

Definição: a distância de s a v é o comprimento de um<br />

caminho mais curto de s a v.<br />

Se v não é alcançável a partir de s, então diz<strong>em</strong>os que a<br />

distância de s a v é ∞ (infinita).<br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong> recebe um grafo G = (V, E) e um<br />

vértice especificado s chamado fonte (source).<br />

Percorre todos os vértices alcançáveis a partir de s <strong>em</strong><br />

ord<strong>em</strong> de distância deste. Vértices a mesma distância<br />

pod<strong>em</strong> ser percorridos <strong>em</strong> qualquer ord<strong>em</strong>.<br />

Constrói uma Árvore de <strong>Busca</strong> <strong>em</strong> Largura com raiz s.<br />

Cada caminho de s a um vértice v nesta árvore<br />

corresponde a um caminho mais curto de s a v.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong><br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong><br />

Inicialmente a Árvore de <strong>Busca</strong> <strong>em</strong> Largura contém<br />

apenas o vértice fonte s.<br />

Para cada vizinho v de s, o vértice v e a aresta (s, v) são<br />

acrescentadas à árvore.<br />

O processo é repetido para os vizinhos dos vizinhos de s e<br />

assim por diante, até que todos os vértices atingíveis por s<br />

sejam inseridos na árvore.<br />

Este processo é impl<strong>em</strong>entado através de uma fila Q.<br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong> atribui cores a cada vértice: branco,<br />

cinza e preto.<br />

Cor branca = “não visitado”.<br />

Inicialmente todos os vértices são brancos.<br />

Cor cinza = “visitado pela primeira vez”.<br />

Cor Preta = “teve seus vizinhos visitados”.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


Ex<strong>em</strong>plo (CLRS)<br />

Ex<strong>em</strong>plo (CLRS)<br />

r<br />

∞<br />

s<br />

0<br />

t<br />

∞<br />

u<br />

∞<br />

r s t u<br />

∞ ∞<br />

1<br />

0<br />

Q<br />

s<br />

Q<br />

w<br />

r<br />

∞ ∞ ∞ ∞<br />

v w x y<br />

0<br />

∞<br />

v<br />

1<br />

w<br />

∞<br />

x<br />

∞<br />

y<br />

1<br />

1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Ex<strong>em</strong>plo (CLRS)<br />

Ex<strong>em</strong>plo (CLRS)<br />

r<br />

1<br />

s<br />

0<br />

t<br />

2<br />

u<br />

∞<br />

r s t<br />

1<br />

0<br />

2<br />

u<br />

∞<br />

Q<br />

r<br />

t<br />

x<br />

Q<br />

t<br />

x<br />

v<br />

∞<br />

v<br />

1<br />

w<br />

2<br />

x<br />

∞<br />

y<br />

1<br />

2 2<br />

2 1<br />

2<br />

v w x<br />

∞<br />

y<br />

2<br />

2 2<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


Ex<strong>em</strong>plo (CLRS)<br />

Ex<strong>em</strong>plo (CLRS)<br />

r s t<br />

1<br />

0<br />

2<br />

u<br />

3<br />

r s t<br />

1<br />

0<br />

2<br />

u<br />

3<br />

Q<br />

x<br />

v<br />

u<br />

Q<br />

v<br />

u<br />

y<br />

2 1<br />

v<br />

w<br />

2<br />

x<br />

∞<br />

y<br />

2<br />

2 3<br />

2 1<br />

v<br />

w<br />

2<br />

x<br />

3<br />

y<br />

2<br />

3 3<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Ex<strong>em</strong>plo (CLRS)<br />

Ex<strong>em</strong>plo (CLRS)<br />

r s t<br />

1<br />

0<br />

2<br />

u<br />

3<br />

r s t u<br />

1<br />

0<br />

2<br />

3<br />

Q<br />

u<br />

y<br />

Q<br />

y<br />

2 1<br />

2 3<br />

v w x y<br />

3 3<br />

2 1<br />

2 3<br />

v w x y<br />

3<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


Ex<strong>em</strong>plo (CLRS)<br />

Cores<br />

r s t u<br />

1<br />

0<br />

2<br />

3<br />

2 1<br />

2 3<br />

v w x y<br />

Q ∅<br />

Para cada vértice v guarda-se sua cor atual cor[v] que<br />

pode ser branco, cinza ou preto.<br />

Para efeito de impl<strong>em</strong>entação, isto não é realmente<br />

necessário, mas facilita o entendimento do algoritmo.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Representação da árvore e das distâncias<br />

<strong>Busca</strong> <strong>em</strong> <strong>largura</strong><br />

A raiz da Árvore de <strong>Busca</strong> <strong>em</strong> Largura é s.<br />

Cada vértice v (diferente de s) possui um pai π[v].<br />

O caminho de s a v na Árvore é dado por:<br />

v, π[v], π[π[v]], π[π[π[v]]], . . .,s.<br />

Uma variável d[v] é usada para armazenar a distância de<br />

s a v (que será determinada durante a busca).<br />

Recebe um grafo G (na forma de listas de adjacências) e um<br />

vértice s ∈ V[G] e devolve<br />

(i) para cada vértice v, a distância de s a v <strong>em</strong> G e<br />

(ii) uma Árvore de <strong>Busca</strong> <strong>em</strong> Largura.<br />

BUSCA-EM-LARGURA(G, s)<br />

0 ⊲ Inicialização<br />

1 para cada u ∈ V[G] − {s} faça<br />

2 cor[u] ← branco<br />

3 d[u] ← ∞<br />

4 π[u] ← NIL<br />

5 cor[s] ← cinza<br />

6 d[s] ← 0<br />

7 π[s] ← NIL<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


<strong>Busca</strong> <strong>em</strong> <strong>largura</strong><br />

Consumo de t<strong>em</strong>po<br />

8 Q ← ∅<br />

9 ENQUEUE(Q, s)<br />

10 enquanto Q ≠ ∅ faça<br />

11 u ← DEQUEUE(Q)<br />

12 para cada v ∈ Adj[u] faça<br />

13 se cor[v] = branco então<br />

14 cor[v] ← cinza<br />

15 d[v] ← d[u] + 1<br />

16 π[v] ← u<br />

17 ENQUEUE(Q, v)<br />

18 cor[u] ← preto<br />

Método de análise agregado.<br />

A inicialização consome t<strong>em</strong>po Θ(V).<br />

Depois que um vértice deixa de ser branco, ele não volta a<br />

ser branco novamente. Assim, cada vértice é inserido na<br />

fila Q no máximo uma vez. Cada operação sobre a fila<br />

consome t<strong>em</strong>po Θ(1) resultando <strong>em</strong> um total de O(V).<br />

Em uma lista de adjacência, cada vértice é percorrido<br />

apenas uma vez. A soma dos comprimentos das listas é<br />

Θ(E). Assim, o t<strong>em</strong>po gasto para percorrer as listas é<br />

O(E).<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Complexidade de t<strong>em</strong>po<br />

Corretude<br />

Conclusão:<br />

A complexidade de t<strong>em</strong>po de BUSCA-EM-LARGURA é<br />

O(V + E).<br />

Agora falta mostrar que BUSCA-EM-LARGURA funciona.<br />

Para u, v ∈ E[G], seja dist(u, v) a distância de u a v.<br />

Precisamos mostrar que:<br />

d[v] = dist(s, v) para todo v ∈ V[G].<br />

A função predecessor π[ ] define uma Árvore de <strong>Busca</strong> <strong>em</strong><br />

Largura com raiz s.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


Alguns l<strong>em</strong>as<br />

Alguns l<strong>em</strong>as<br />

L<strong>em</strong>a 1. Seja G um grafo e s ∈ V[G].<br />

Então para toda aresta (u, v) t<strong>em</strong>os que<br />

dist(s, v) ≤ dist(s, u) + 1.<br />

Prova:<br />

Imediato.<br />

d[v] é uma estimativa superior de dist(s, v).<br />

L<strong>em</strong>a 2. Durante a execução do algoritmo vale o seguinte<br />

invariante<br />

d[v] ≥ dist(s, v) para todo v ∈ V[G].<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Prova do L<strong>em</strong>a 2<br />

Alguns l<strong>em</strong>as<br />

Indução no número de operações ENQUEUE.<br />

Base: quando s é inserido na fila t<strong>em</strong>os d[s] = 0 = dist(s, s) e<br />

d[v] = ∞ ≥ dist(s, v) para v ∈ V − {s}.<br />

Passo de indução: v é descoberto enquanto a busca é feita <strong>em</strong><br />

u (percorrendo Adj[u]). Então<br />

d[v] = d[u] + 1<br />

≥ dist(s, u) + 1 (HI)<br />

≥ dist(s, v). (L<strong>em</strong>a 1)<br />

Note que d[v] nunca muda após v ser inserido na fila. Logo, o<br />

invariante vale.<br />

L<strong>em</strong>a 3. Suponha que 〈v 1 , v 2 , . . .,v r 〉 seja a disposição da fila<br />

Q na linha 10 <strong>em</strong> uma iteração qualquer.<br />

Então<br />

e<br />

d[v r ] ≤ d[v 1 ] + 1<br />

d[v i ] ≤ d[v i+1 ] para i = 1, 2, . . .,r − 1.<br />

Em outras palavras, os vértices são inseridos na fila <strong>em</strong> ord<strong>em</strong><br />

crescente e há no máximo dois valores de d[v] para vértices<br />

na fila.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


Prova do L<strong>em</strong>a 3<br />

Indução no número de operações ENQUEUE e DEQUEUE.<br />

Base: Q = {s}. O l<strong>em</strong>a vale trivialmente.<br />

Passo de indução: v 1 é r<strong>em</strong>ovido de Q. Agora v 2 é o primeiro<br />

vértice de Q. Então<br />

d[v r ] ≤ d[v 1 ] + 1 ≤ d[v 2 ] + 1.<br />

As outras desigualdades se mantêm.<br />

Passo de indução: v = v r+1 é inserido <strong>em</strong> Q. Suponha que a<br />

busca é feita <strong>em</strong> u neste momento. Logo d[v 1 ] ≥ d[u]. Então<br />

d[v r+1 ] = d[v] = d[u] + 1 ≤ d[v 1 ] + 1.<br />

Pela HI d[v r ] ≤ d[u] + 1. Logo<br />

d[v r ] ≤ d[u] + 1 = d[v] = d[v r+1 ].<br />

As outras desigualdades se mantêm.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Corretude<br />

Teor<strong>em</strong>a. Seja G um grafo e s ∈ V[G].<br />

Então após a execução de BUSCA-EM-LARGURA,<br />

d[v] = dist(s, v) para todo v ∈ V[G].<br />

e<br />

π[ ] define uma Árvore de <strong>Busca</strong> <strong>em</strong> Largura.<br />

Prova:<br />

Note que se dist(s, v) = ∞ então d[v] = ∞ pelo L<strong>em</strong>a 3.<br />

Então vamos considerar o caso <strong>em</strong> que dist(s, v) < ∞.<br />

Vamos provar por indução <strong>em</strong> dist(s, v) que d[v] = dist(s, v).<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Corretude<br />

Corretude<br />

Base: Se dist(s, v) = 0 então v = s e d[s] = 0.<br />

Hipótese de indução: Suponha então que d[u] = dist(s, u)<br />

para todo vértice u com dist(s, u) < k.<br />

Seja v um vértice com dist(s, v) = k. Considere um caminho<br />

mínimo de s a v <strong>em</strong> G e chame de u o vértice que antecede v<br />

neste caminho. Note que dist(s, u) = k − 1.<br />

Considere o instante <strong>em</strong> que u foi r<strong>em</strong>ovido da fila Q (linha 11<br />

de BUSCA-EM-LARGURA). Neste instante, v é branco, cinza ou<br />

preto.<br />

se v é branco, então a linha 15 faz com<br />

d[v] = d[u] + 1 = (k − 1) + 1 = k.<br />

se v é cinza, então v foi visitado antes por algum vértice w<br />

(logo, v ∈ Adj[w]) e d[v] = d[w] + 1. Pelo L<strong>em</strong>a 3,<br />

d[w] ≤ d[u] = k − 1 e segue que d[v] = k.<br />

se v é preto, então v já passou pela fila Q e pelo L<strong>em</strong>a 3,<br />

d[v] ≤ d[u] = k − 1. Mas por outro lado, pelo L<strong>em</strong>a 2,<br />

d[v] ≥ dist(s, v) = k, o que é uma contradição. Este caso<br />

não ocorre.<br />

Portanto, <strong>em</strong> todos os casos t<strong>em</strong>os que d[v] = dist[s, v].<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1


Caminho mais curto<br />

Ex<strong>em</strong>plo<br />

Imprime um caminho mais curto de s a v.<br />

Print-Path(G, s, v)<br />

1 se v = s então<br />

2 imprime s<br />

3 senão<br />

4 se π[v] = NIL então<br />

4 imprime não existe caminho de s a v.<br />

5 senão<br />

6 Print-Path(G, s, π[v])<br />

7 imprime v.<br />

Exercício. Mostre que um grafo G é bipartido se e somente se<br />

não contém um ciclo de comprimento ímpar.<br />

Projete um algoritmo linear que dado um grafo G devolve<br />

uma bipartição de G, ou<br />

um ciclo ímpar <strong>em</strong> G.<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1<br />

Cid Carvalho de Souza, Cândida Nunes da Silva, Orlando Lee MO417 — Complexidade de Algoritmos – v. 2.1

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!