1 / 24

Análise e Síntese de Algoritmos

Análise e Síntese de Algoritmos. Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25. 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

braith
Download Presentation

Análise e Síntese de Algoritmos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Análise e Síntese de Algoritmos Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25

  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 e Algoritmo de Floyd-Warshall 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 Análise e Síntese de Algoritmos

  4. Caminhos Mais Curtos entre Todos os 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 como fonte: 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 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 x n) D = (dij) • dij é o peso do caminho mais curto entre os vértices i e j • dij = (vi,vj) 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 Análise e Síntese de Algoritmos

  7. APSPs — Solução Recursiva • Sub-caminhos de caminhos mais curtos são também caminhos mais curtos • Peso mínimo em caminho de vértice i para vértice j que 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, wjj = 0 Análise e Síntese de Algoritmos

  8. 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’ 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) 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 reduzindo número de matrizes calculadas: (n3lg n) • A cada iteração, calcular D(2i) em função de D(i) e de D(i) • Exemplo 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 com vértices intermédios retirados do conjunto {1,,k} e seja 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értices intermé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} Análise e Síntese de Algoritmos

  11. p2 k p1 i j APSPs — Algoritmo de Floyd-Warshall • Formulação Vértices entre 1 e k-1 Vértices entre 1 e k Análise e Síntese de Algoritmos

  12. APSPs — Algoritmo de Floyd-Warshall • Complexidade: (n3) • Exemplo Floyd-Warshall(W) n = rows[W] D(0) = W for k = 1 to n for i = 1 to n for j = 1 to n return D(n) 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, • Aplicação: autorizações de acesso • Algoritmo: • Atribuir a cada arco peso 1 e utilizar algoritmo de Floyd-Warshall • Se dij , então (i, j)  E* • Complexidade: (n3) 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 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 n if i = j or (i, j)  E else for k = 1 to n for i = 1 to n for j = 1 to n return T(n) 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 para cada vértice • Caso contrário, calcular novo conjunto de pesos não negativos 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 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ó se w’(p) = ’(v0, vk) = (v0, vk) + h(v0) - h(vk) • Existe ciclo negativo com w se e só se existe ciclo negativo com w’ Análise e Síntese de Algoritmos

  18. APSPs — Algoritmo de Johnson Hipótese: existe pz, caminho mais curto de v0 para vk com w’ Então: O que implica Mas p é caminho mais curto com w; contradição ! OBS: Para quaisquer caminhos p1, p2 entre v0 e vk, verifica-se w(p1) < w(p2)  w’(p1) < w’(p2) Análise e Síntese de Algoritmos

  19. APSPs — Algoritmo de Johnson 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’ 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) Análise e Síntese de Algoritmos

  20. 24.10 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! 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) 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-Ford calcular w’(u,v) = w(u,v) + h(u) - h(v) para cada arco (u,v) foreach v  V[G] executar Dijkstra(G,w’,u); calcular ’(u, v) duv = ’(u, v) + h(v) - h(u) return D 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 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) Análise e Síntese de Algoritmos

More Related