Análise e Síntese de Algoritmos - Autenticação · k-1} •Considerar todos os caminhos entre i...
Transcript of Análise e Síntese de Algoritmos - Autenticação · k-1} •Considerar todos os caminhos entre i...
1
Análise e Síntese de Algoritmos
Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25
2006/2007 Análise e Síntese de Algoritmos 2
Contexto
• Algoritmos Elementares em Grafos (CLR, Cap. 22)– BFS & DFS– Ordenação Topológica & SCCs
• Árvores Abrangentes de Menor Custo (CLR, Cap. 23)– Algoritmos de Borůvka, Kruskal e Prim
• Caminhos mais curtos com fonte única (CLR, Cap. 24)– Algoritmos de Dijkstra e Bellman-Ford
• Caminhos mais curtos entre todos os pares (CLR, Cap. 25)– Solução Recursiva, Algoritmos de Floyd-Warshall e Johnson
2
2006/2007 Análise e Síntese de Algoritmos 3
Resumo
• Caminhos Mais Curtos entre Todos os Pares (APSPs)– Definições– Soluções recursivas
• Algoritmo de Floyd-Warshall– Fecho Transitivo– Algoritmo de Johnson
2006/2007 Análise e Síntese de Algoritmos 4
Caminhos Mais Curtos entre Todosos Pares (APSPs) — Observações• Encontrar caminhos mais curtos entre todos os pares
de vértices• Se pesos não negativos
– Utilizar algoritmo de Dijkstra, assumindo cada vértice comofonte: O(V E lg V) (que é O(V3 lg V) se grafo é denso)
• Se pesos negativos– Utilizar algoritmo de Bellman-Ford, assumindo cada vértice
como fonte: O(V2E) (que é O(V4) se grafo é denso)
• Objectivo: Encontrar algoritmos mais eficientes
3
2006/2007 Análise e Síntese de Algoritmos 5
APSPs — Definições
• Representação: utilização de matriz de adjacências• Pesos dos arcos: matriz (n x n) W = (wij)
• Representação dos caminhos mais curtos: matriz (n xn) D = (dij)– dij é o peso do caminho mais curto entre os vértices i e j
• dij = δ(vi,vj)
( )
( )!"
!#
$
%&'
(&
=
=
Ej,i e ji se
Ej,i e ji sej)(i, arco do peso
ji se0
wij
2006/2007 Análise e Síntese de Algoritmos 6
APSPs — Definições
• Representação de caminhos mais curtos– Matriz de predecessores ∏ = (πij)– πij:
• NIL: se i = j ou não existe caminho de i para j• Caso contrário: predecessor de j num caminho mais
curto de i para j– Sub-grafo de predecessores de G para i, Gπ, i = (Vπ, i, Eπ, i)
• Sub-grafo induzido pela linha i de ∏– Exemplo
{ } {}iNIL:VjV iji, !"#$=#
( ){ }{i}Vj:j,E i,iji, !"#= ##
4
2006/2007 Análise e Síntese de Algoritmos 7
APSPs — Solução Recursiva
• Sub-caminhos de caminhos mais curtos sãotambém caminhos mais curtos
• Peso mínimo em caminho de vértice i para vértice jque contém não mais do que m arcos:– Com m = 0, existe caminho de i para j se e só se i = j
– Para m ≥ 1,
)m(ijd
( ) ( ) ( ){ }{ } ( ){ }kj1mik
nk1kj
1mik
nk1
1mij
mij wdminwdmin,dmind +=+= !
""
!
""
!
( )
!"#
$%
==
ji se
ji se0d 0
ij
wjj = 0
2006/2007 Análise e Síntese de Algoritmos 8
APSPs — Solução Recursiva
• Calcular sequência de matrizes D(1), …, D(n-1), onde– D(n-1) contém os pesos dos caminhos mais curtos– D(1) = W
• Complexidade: Θ(n3) p/ cada matriz; Total: Θ(n4)
Extend-Shortest-Paths(D,W)n = rows[W]D’: matriz (n x n)for i = 1 to n
for j = 1 to n
for k = 1 to n
return D’( )kjik'ij
'ij wd,dmind +=
!='ijd
5
2006/2007 Análise e Síntese de Algoritmos 9
APSPs — Solução Recursiva
• Genericamente: calcular D(i) em função de D(i-1) (e de W)• Complexidade para cálculo de D(n): Θ(n4)
• OBS: é possível melhorar complexidade reduzindonúmero de matrizes calculadas: Θ(n3lg n)– A cada iteração, calcular D(2i) em função de D(i) e de D(i)
2006/2007 Análise e Síntese de Algoritmos 10
APSPs — Algoritmo de Floyd-Warshall
• Caracterização de um caminho mais curto– Vértices intermédios de caminho p = 〈v1,v2,…,vk〉, {v2,…,vk-1}
• Considerar todos os caminhos entre i e j comvértices intermédios retirados do conjunto {1,…,k} eseja p um caminho mais curto (p é simples)– Se k não é vértice intermédio de p, então todos os vértices
intermédios de p estão em {1,…,k-1}– Se k é vértice intermédio de p, então existem caminhos p1 e
p2, respectivamente de i para k e de k para j com vérticesintermédios em {1,…,k}
• k não é vértice intermédio de p1 e de p2
• p1 e p2 com vértices intermédios em {1,…,k-1}
6
2006/2007 Análise e Síntese de Algoritmos 11
APSPs — Algoritmo de Floyd-Warshall
• Formulação
( )( ) ( ) ( )( )!
"#
$+
== %%% 1k sedd,dmin
0k sewd 1k
kj1k
ik1k
ij
ijkij
i j
kp1
p2
Vértices entre1 e k-1
Vértices entre1 e k
2006/2007 Análise e Síntese de Algoritmos 12
APSPs — Algoritmo de Floyd-Warshall
• Complexidade: Θ(n3)• Exemplo
Floyd-Warshall(W)n = rows[W]D(0) = Wfor k = 1 to n
for i = 1 to nfor j = 1 to n
return D(n)
( ) ( ) ( ) ( )( )1kkj
1kik
1kij
kij dd,dmind !!! +=
7
2006/2007 Análise e Síntese de Algoritmos 13
Fecho Transitivo de um Grafo Dirigido
• Dado um grafo G = (V, E) dirigido, o fecho transitivoé definido por G* = (V, E*) tal que,
E*={(i, j): existe caminho de i para j em G}
• Algoritmo:– Atribuir a cada arco peso 1 e utilizar algoritmo de Floyd-
Warshall• Se dij ≠ ∞, então (i, j) ∈ E*• Complexidade: Θ(n3)
2006/2007 Análise e Síntese de Algoritmos 14
Fecho Transitivo de um Grafo Dirigido
• Outro algoritmo:– Substituir operações min e + por ∨ e ∧, respectivamente– Se existe caminho de i para j com todos os vértices
intermédios em {1,2,…,k},– Caso contrário,– Formulação:
– Complexidade: Θ(n3) (mas constantes menores)– Exemplo
( ) 1t kij =( ) 0t kij =
( ) ( ) ( ) ( )( ) 1k setttt 1kkj
1kik
1kij
kij !"#= $$$( ) ( )
( )!"#
$=
%&=
Ej,i ou ji se1
Ej,i e ji se0t 0
ij
8
2006/2007 Análise e Síntese de Algoritmos 15
Fecho Transitivo de um Grafo Dirigido
Transitive-Closure(G)n = |V[G]|for i = 1 to n
for j = 1 to nif i = j or (i, j) ∈ E
else
for k = 1 to nfor i = 1 to n
for j = 1 to n
return T(n)
( ) ( ) ( ) ( )( )1kkj
1kik
1kij
kij tttt !!! "#=
( ) 1t 0ij =
( ) 0t 0ij =
2006/2007 Análise e Síntese de Algoritmos 16
APSPs — Algoritmo de Johnson
• Utiliza algoritmos de Dijkstra e de Bellman-Ford• Baseado em re-pesagem dos arcos
– Se arcos com pesos não negativos, utilizar Dijkstra paracada vértice
– Caso contrário, calcular novo conjunto de pesos nãonegativos w’, tal que
• Um caminho mais curto de u para v com função w étambém caminho mais curto com função w’
• Para cada arco (u, v) o peso w’(u, v) é não negativo
9
2006/2007 Análise e Síntese de Algoritmos 17
APSPs — Algoritmo de Johnson
• Dado G = (V, E), com função de pesos w e de re-pesagem h: V → R, seja w’(u, v) = w(u, v) + h(u) - h(v)
• Seja p = 〈v0,v1,…,vk〉. Então w(p) = δ(v0, vk) se e só sew’(p) = δ’(v0, vk) = δ(v0, vk) + h(v0) - h(vk)– Existe ciclo negativo com w se e só se existe ciclo negativo
com w’
( ) ( ) ( ) ( )k0 vhvhpwp'w !+=
( ) ( )
( ) ( ) ( )( )
( ) ( ) ( ) ( ) ( ) ( )k0k0
k
1ii1i
k
1ii1ii1i
k
1ii1i
vhvhpwvhvhv,vw
vhvhv,vw
v,v'wp'w
!+=!+=
!+=
=
"
"
"
=!
=!!
=!
2006/2007 Análise e Síntese de Algoritmos 18
APSPs — Algoritmo de Johnson
( ) ( ) ( ) ( )k0k0 v,v'p'wv,vpw !="!=
( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )k0zk0z vhvhpwp'wp'wvhvhpw !+=<=!+
Hipótese: existe pz, caminho mais curto de v0 para vk com w’Então: ( ) ( )p'wp'w z <
( ) ( )pwpwz<O que implica
Mas p é caminho mais curto com w; contradição !
OBS: Para quaisquer caminhos p1, p2 entre v0 e vk, verifica-sew(p1) < w(p2) ⇔ w’(p1) < w’(p2)
10
2006/2007 Análise e Síntese de Algoritmos 19
APSPs — Algoritmo de Johnson
( ) ( ) ( ) ( )k0k0 v,v'p'wv,vpw !="!=
Semelhante:Admitir pz como caminho mais curto de v0 para vk com w(ou considerar observação anterior)
Existe ciclo negativo com w se e só se existe com w’
( ) ( ) ( ) ( ) ( )cwvhvhcwc'wk0=!+=
( ) 0cw;vv;v,,v,vc k0k10 <=!"= K
∴Caminhos mais curtos e ciclos negativos inalteráveis com mudanças na função de pesos w’(u, v) = w(u, v) + h(u) - h(v)
2006/2007 Análise e Síntese de Algoritmos 20
APSPs — Algoritmo de Johnson
• Dado G = (V, E), criar G’ = (V’,E’):– V’ = V ∪ { s }– E’ = E ∪ { (s, v) : v ∈ V } (∀ v ∈ V, atingível a partir de s)– w(s, v) = 0
• Com ciclos negativos:– Detectados com algoritmo de Bellman-Ford aplicado a G’ !
• Sem ciclos negativos:– Definir: h(v) = δ(s, v)– Dado que: h(v) ≤ h(u) + w(u, v)– Verifica-se: w’(u, v) = w(u, v) + h(u) - h(v) ≥ 0 !
24.10
11
2006/2007 Análise e Síntese de Algoritmos 21
APSPs — Algoritmo de Johnson
• Executar Dijkstra para todo o u ∈ V– Cálculo de δ’(u,v), para u ∈ V– Mas também,
• δ’(u,v) = δ(u, v) + h(u) - h(v)• δ(u,v) = δ’(u, v) + h(v) - h(u)
2006/2007 Análise e Síntese de Algoritmos 22
APSPs — Algoritmo de Johnson
Johnson(G)Representar G’if Bellman-Ford(G’,w,s) = FALSE
print “Indicar ciclo negativo”else
atribuir h(v) = δ(s, v), calculado com Bellman-Fordcalcular w’(u,v) = w(u,v) + h(u) - h(v) para cada arco (u,v)foreach v ∈ V[G]
executar Dijkstra(G,w’,v); calcular δ’(u, v)duv = δ’(u, v) + h(v) - h(u)
return D
12
2006/2007 Análise e Síntese de Algoritmos 23
APSPs — Algoritmo de Johnson
• Complexidade:– Bellman-Ford: O(V E)– Executar Dijkstra para cada vértice: O(V (V + E) lg V)
• Assumindo amontoado (heap) binário
– Total: O(V (V + E) lg V)• Útil para grafos esparsos
• Exemplo
2006/2007 Análise e Síntese de Algoritmos 24
Revisão
• Caminhos Mais Curtos entre Todos os Pares (APSPs)– Definições– Solução recursiva– Algoritmo de Floyd-Warshall– Fecho Transitivo– Algoritmo de Johnson
• A seguir:– Fluxos máximos em grafos (CLR, Cap. 26)