Busca em largura
Busca em largura
Busca em largura
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